提高SurfaceView-dervied自定义视图的性能?

tro*_*foe 7 android surfaceview double-buffering

我编写了一个简单的Android应用程序,使用派生自定义视图绘制迷宫SurfaceView.它遵循LunarLander示例应用程序的模型,并使用后台线程直接执行所有计算和绘图到SurfaceHolder对象中.

一切都很好,并且它适用于中小型迷宫,但如果我将迷宫单元格大小设置为8像素,则应用程序可以在迷宫中抓取大量单元格.

代码正在做一些我不喜欢的事情,即绘制每个单元格,即使它没有改变,这也是为了避免SurfaceView双缓冲区中的屏幕闪烁(在应用程序的先前迭代中我正在绘制的内容已经改变了导致一个疯狂的混乱).

我想要的是能够使用SurfaceView但更有选择性的东西.这可能吗?如果没有,有哪些替代方案?如何保持屏幕外的位图,并有选择地首先绘制?

编辑:我实现了一个屏幕BitmapCanvas组合,由我的定时器驱动状态机写入,只绘制雕刻/解决方案中受影响的区域.我再简单地画整个屏幕外的位图到SurfaceView的内run()方法,这解决了我的问题; 我能够将单元格大小降低到5像素,性能很好.

Ped*_*iro 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像素,则应用程序可以在迷宫中抓取大量单元格.

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