我在游戏的每一帧中画了很多线条矩形 - 这是老式手持电子游戏的娱乐。那些具有用于主游戏的原始点阵显示和用于文本或某些图像的自定义图像的内容。
我在虚拟点阵屏幕上有 20x20 大“像素”,我还在屏幕上绘制了一些 7 段显示和其他一些东西。
根据TraceView的说法,大部分时间都花在drawLine和drawRectangle方法上,因为它们实在太多了。我绘制了点阵显示的每个“像素”,并且7段显示的每个段every frame.
我想到了一个优化,即我只会重新绘制那些发生变化的像素/段,因此我保存了像素/段的先前状态并尝试仅重新绘制已更改的像素/段。基本上这是一个粗略的失效。
我期望的行为是画布在最后一帧完成绘制后将保持原样,并且我只会重新绘制必要的内容。
唉,我的画布闪烁为黑色,每隔一段时间,当我的屏幕状态发生变化时,只有点矩阵显示/段的像素会在一帧中闪烁。我确保我没有清除我的画布。
我正在 SurfaceView 内的 Canvas 上绘图,更新线程,如 Lunar Lander Android 示例中所述。在月球着陆器示例中,他们重新绘制了每个帧中的所有内容。
也许我可以将第一帧上的所有内容渲染为位图,然后在每个其他帧上更新该位图?
我的 Paint() 方法应该使用哪种技术?
SurfaceHolder.unlockCanvasAndPost() 实际上在 Surface 上进行页面翻转,因此即使前一帧没有被清除,您也会得到第二个最旧的帧,而不是您刚刚绘制的帧。并且每次在表面上执行 lock() 都会实例化一个新的画布,这可能正在其构造函数中进行清除。
您最好像有人建议的那样绘制位图,然后每次想要将图像呈现给显示器时在画布上绘制位图。您可以从位图中获取画布并在其中绘制
就像其他人建议的那样(非常模糊),您可以为点阵显示生成精灵并直接从位图缓存中绘制它们,而不是使用原始命令进行绘制。即对于点阵计算器,您可以将所有 0-9 生成 10 个位图,然后将它们简单地块传输到画布上,而不是调用一组 drawLine/Rect 操作。
如果以上仍然太慢还有opengl,它利用了硬件加速
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)