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

时间:2010-11-26 21:06:56

标签: android canvas

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

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

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

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

我期待的行为是Canvas会在最后一帧完成绘画之后保持不变,而且我只会重绘必要的内容。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

为什么不去Sprites