【发布时间】:2012-10-08 10:34:24
【问题描述】:
我正在尝试在单独的线程中逐步在画布上绘制波形,即在线程的每个循环中仅绘制硬件最近获取的部分而不重绘整个曲线。
我不确定是否可以依赖 SurfaceHolder.unlockCanvasAndPost 和 SurfaceHolder.lockCanvas 之间保留的画布内容。
文档似乎对此有点模棱两可,我的实验给出了令人惊讶的结果:在绘图线程的两个后续循环中返回的画布的“旧”内容不同。看起来好像交替使用了两个画布(但我检查了 - 它是相同的画布但内容不同)。
我发现重现此行为的最简单方法:
导入 LunarLander 示例应用程序。
在 LunarView.run 方法的循环中插入 sleep(500) 指令。
在 LunarView.doDraw 方法中注释掉以下行:
canvas.drawBitmap(mBackgroundImage, 0, 0, null);,删除旧内容。
运行游戏,让飞船坠毁。您会看到船的中间位置,但它们会闪烁:奇数和偶数位置将交替显示。
所以,我的问题是:我们可以绘制图片,仅对之前绘制的内容添加更改吗?如果可以,是否有任何记录在案的方法来处理上述奇怪行为?
【问题讨论】:
-
使用两个位图。一种带背景,一种带移动内容
-
@Doomsknight。感谢您的评论,但是问题不在于绘制背景,而事实上,在之前的循环中绘制的曲线的某些部分在绘图线程的每个第二循环中都是可见的。当然,如果我的问题没有找到答案,我会使用缓存位图,但我需要尽可能减少绘制时间。
-
基于登月,当我用它作为基地时,我遇到了同样的问题。它本质上是在两个绘制的图像之间来回滑动。仔细阅读代码并思考它在做什么。这很可能是原始代码中的错误。
-
@ Doomsknight - 代码看起来没问题。闪烁看起来像一些缓存问题。
-
登月不缓存。它每次都绘制背景图像(刷新),然后绘制宇宙飞船。试试这个:blorb.tumblr.com/post/236799414/simple-java-android-game-loop