7

我编写了一个简单的 Android 应用程序,它使用从SurfaceView. 它遵循LunarLander 示例应用程序SurfaceHolder的模型,并使用后台线程直接在对象中执行所有计算和绘图。

一切都很好,它对于中小型迷宫运行良好,但是如果我将迷宫单元大小设置为 8 像素,那么应用程序会在迷宫中爬行很多单元。

代码正在做一些我不喜欢的事情,即使它没有改变,它也会绘制每个单元格,这是避免屏幕从SurfaceView双缓冲区闪烁所必需的(在应用程序的先前迭代中,我正在绘制改变的内容,并且导致混乱)。

我想要的是能够使用SurfaceView但对绘制的内容更具选择性。这可能吗?如果没有,有什么替代方案?保留一个离屏位图,然后有选择地先画进去怎么样?

编辑:我实现了一个屏幕外BitmapCanvas组合,由我的计时器驱动状态机写入,仅绘制在雕刻/解决方案期间受影响的那些区域。然后我简单地将整个屏幕外位图绘制到方法SurfaceViewrun(),这解决了我的问题;我能够将单元格大小降低到 5 像素并且性能很好。

4

1 回答 1

5

关于双缓冲问题:

看看这个教程系列。你觉得你处理绘图的方式有什么不同吗? https://web.archive.org/web/20121109162356/http://www.droidnova.com/playing-with-graphics-in-android-part-iii,176.html

关于优化绘图:

以下链接解释了一些方法:

http://developer.android.com/guide/topics/graphics/opengl.html

http://developer.android.com/reference/android/opengl/GLSurfaceView.html

连续渲染与脏时渲染

大多数 3D 应用程序,例如游戏或模拟,都是连续动画的。但一些 3D 应用程序更具反应性:它们被动地等待用户执行某项操作,然后对其做出反应。对于那些类型的应用程序,连续重绘屏幕的默认 GLSurfaceView 行为是浪费时间。如果您正在开发响应式应用程序,您可以调用 GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY),它会关闭连续动画。然后,只要您想重新渲染,就调用 GLSurfaceView.requestRender() 。

此外,在 2D 游戏中,计算用户所看到的内容特别容易,因此请避免将对象从可见场景中绘制出来。

最后一点:

你说

一切都很好,它对于中小型迷宫运行良好,但是如果我将迷宫单元大小设置为 8 像素,那么应用程序会在迷宫中爬行很多单元。

这是否意味着您正在计算迷宫的解决方案?如果是这样,您不应该在绘制它的同一线程中执行此操作。你应该在另一个线程中解决它。(我可能理解错了)

于 2011-02-14T17:05:58.417 回答