我试图在一个单独的线程中逐步在画布上绘制波形,即在线程的每个循环中仅绘制硬件最近获取的部分而不重绘整个曲线。
我不确定我是否可以依赖保留在SurfaceHolder.unlockCanvasAndPost
和之间的画布内容SurfaceHolder.lockCanvas
。
文档似乎对此有点模棱两可,我的实验给出了令人惊讶的结果:在绘图线程的两个后续循环中返回的画布的“旧”内容是不同的。看起来好像交替使用了两个画布(但我检查了 - 它是相同的画布但内容不同)。
我发现重现此行为的最简单方法:
导入 LunarLander 示例应用程序。
在 LunarView.run 方法中,在循环中插入 sleep(500) 指令。
在 LunarView.doDraw 方法中注释掉以下行:
canvas.drawBitmap(mBackgroundImage, 0, 0, null);
,它会删除旧的内容。
运行游戏,让飞船坠毁。您将看到船的中间位置,但它们会闪烁:奇数和偶数位置将交替显示。
所以,我的问题是:我们是否可以绘制仅对之前绘制的内容添加更改的图片?如果可以,是否有任何记录在案的方法来处理上述奇怪行为?