我正在尝试在一个单独的线程中逐渐在画布上绘制波形,即在线程的每个循环中仅绘制最近由硬件获取的部分而不重绘整个曲线。
我不确定我是否可以依赖SurfaceHolder.unlockCanvasAndPost
和SurfaceHolder.lockCanvas
之间保留的画布内容。
文档似乎有点含糊不清,我的实验给出了令人惊讶的结果:在绘图线程的两个后续循环中返回的画布的“旧”内容是不同的。看起来两个画布交替使用(但我检查过 - 它是相同的画布,但内容不同)。
我发现重现此行为的最简单方法:
导入LunarLander样本应用程序。
在LunarView.run方法中,在循环中插入sleep(500)指令。
在LunarView.doDraw方法中注释掉该行:
canvas.drawBitmap(mBackgroundImage, 0, 0, null);
,删除旧内容。
运行游戏,让船崩溃。您将看到船的中间位置,但它们将闪烁:奇数和偶数位置将交替显示。
所以,我的问题是:我们可以绘制图片,只将更改添加到之前绘制的内容中,如果是这样的话 - 是否有任何记录的方法来处理上述奇怪的行为?
答案 0 :(得分:0)
登月不会缓存。 它每次绘制背景图像(刷新),然后绘制宇宙飞船。
private void doDraw(Canvas canvas) {
// Draw the background image. Operations on the Canvas accumulate
// so this is like clearing the screen.
canvas.drawBitmap(mBackgroundImage, 0, 0, null);
完全检查你的If条款。也许一个是真假交替。这将导致事物快速连续地绘制然后不绘制。
如果需要,请使用日志输出您的布尔值,以查看是否正在改变。
如果失败了,请改为以下游戏循环。
http://blorb.tumblr.com/post/236799414/simple-java-android-game-loop