android - 如何使用大量图元在 Android Canvas 上绘制游戏

标签 android canvas

我在我的游戏中的每一帧都画了很多矩形线 - 这是对老式手持电子游戏的再创造。主要游戏有粗糙的点阵显示,文本或一些图像有自定义图像。

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

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

我想到了一个优化,我将只重绘那些发生变化的像素/段,所以我保存了像素/段的先前状态并尝试只重绘发生变化的像素/段。基本上这是一个粗略的无效。

我期望的行为是 Canvas 在最后一帧完成绘制后保持原样,我只会重新绘制必要的东西。

唉,我的 Canvas 闪烁成黑色,每隔一段时间当我的屏幕状态改变时,只有点阵显示/段的像素闪烁一帧。我确保我没有清除我的 Canvas 。

我正在 SurfaceView 内的 Canvas 上绘图,更新 Thread,如 Lunar Lander Android 示例中所述。在月球着陆器示例中,他们重新绘制了每一帧中的所有内容。

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

我的 paint() 方法应该使用哪种技术?

最佳答案

SurfaceHolder.unlockCanvasAndPost() 实际上会在 Surface 上进行翻页,因此即使没有清除前一帧,您也会得到第二旧的帧,而不是您刚刚绘制的那一帧。并且每次在表面上执行 lock() 都会实例化一个新 Canvas ,这可能正在其构造函数中进行清除。

您最好像有人建议的那样绘制位图,然后在每次要将图像呈现给显示器时在 Canvas 上绘制位图。您可以从位图中获取 Canvas 以在其中绘制

并且像其他人建议的那样(非常含糊),您可以为点阵显示生成 Sprite 并直接从位图缓存中绘制它们,而不是使用原始命令绘制。即,对于点阵计算器,您可以将所有 0-9 生成为 10 个位图,然后简单地将它们 blit 到 Canvas 上,而不是调用一组 drawLine/Rect 操作。

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

关于android - 如何使用大量图元在 Android Canvas 上绘制游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288539/

相关文章:

javascript - 这种计算 Canvas 元素中非白色像素的方法有什么问题?

javascript - 在 Canvas 内创建可滚动文本

android - Android 中的动画

java - 广播接收器即使在应用程序被用户杀死后也能正常工作

android - 如何为 Glide 设置 OkHttpClient

javascript - KineticJS 缓动

javascript - 查看 Canvas 元素源代码

javascript - 如何将 Canvas 图像数据转换为嵌套象限

java - 连接到google fit android API不在 Activity 类中

Android 模拟器无法启动