如何使用大量原语在Android Canvas上绘制游戏

我在游戏中每帧都绘制了很多线条矩形 – 这是旧式手持电子游戏的再创造.主要游戏的粗点阵显示和文本或某些图像的自定义图像.

我在虚拟点阵屏幕上有20×20大“像素”,我还在屏幕上绘制了一些7段显示器和其他一些东西.

根据TraceView,大部分时间都花在drawLine和drawRectangle方法上,因为它们太多了.我绘制点阵显示的每个“像素”,并在每个帧中显示7段的每个段.

我想到了一个优化,我只会重新绘制那些已更改的像素/片段,因此我保存了之前的像素/片段状态并尝试重新绘制已更改的像素/片段.基本上这是一个粗略的失效.

我期待的行为是Canvas将保留在最后一帧完成绘画之后,我只会重新绘制必要的东西.

唉,我的画布闪烁为黑色,每当我的屏幕状态发生变化时,只有点阵显示/段的像素闪烁一帧.而且我确保我没有清除画布.

我正在使用SurfaceView中的Canvas绘制,更新Thread,如Lunar Lander Android示例中所述.在Lunar Lander样本中,他们重新绘制每帧中的所有内容.

也许我可以在第一帧上将所有内容渲染到位图,然后在每个其他帧上更新该位图?

我应该将哪种技术用于paint()方法?

最佳答案 SurfaceHolder.unlockCanvasAndPost()实际上是在Surface上翻页,所以即使前一帧没有被清除,你也会获得第二个最旧的帧,而不是你刚绘制的帧.并且在表面上执行lock()每次都会实例化一个新画布,这可能正在构造函数中进行清除.

你最好像有人建议一样绘制到Bitmap中,然后每次想要将图像呈现给显示器时在画布上绘制drawBitmap.您可以从位图中获取画布以绘制到它中

就像其他人建议的那样(非常含糊不清),您可以为点阵显示生成精灵,直接从位图缓存中绘制精灵,然后使用基本命令绘制.也就是说,对于点阵计算器,您可以将所有0-9生成为10个位图,只需在画布上进行blit,然后调用一组drawLine / Rect操作.

如果上面仍然太慢仍然有opengl,它利用了硬件加速

点赞