1

我试图在一个单独的线程中逐步在画布上绘制波形,即在线程的每个循环中仅绘制硬件最近获取的部分而不重绘整个曲线。

我不确定我是否可以依赖保留在SurfaceHolder.unlockCanvasAndPost和之间的画布内容SurfaceHolder.lockCanvas

文档似乎对此有点模棱两可,我的实验给出了令人惊讶的结果:在绘图线程的两个后续循环中返回的画布的“旧”内容是不同的。看起来好像交替使用了两个画布(但我检查了 - 它是相同的画布但内容不同)。

我发现重现此行为的最简单方法:

  1. 导入 LunarLander 示例应用程序。

  2. 在 LunarView.run 方法中,在循环中插入 sleep(500) 指令。

  3. 在 LunarView.doDraw 方法中注释掉以下行: canvas.drawBitmap(mBackgroundImage, 0, 0, null);,它会删除旧的内容。

运行游戏,让飞船坠毁。您将看到船的中间位置,但它们会闪烁:奇数和偶数位置将交替显示。

所以,我的问题是:我们是否可以绘制仅对之前绘制的内容添加更改的图片?如果可以,是否有任何记录在案的方法来处理上述奇怪行为?

4

1 回答 1

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 子句。也许一个是真假交替。这将导致事物快速连续绘制然后不绘制。

如果需要,请使用 Log 输出您的布尔值,看看是否有变化。

如果做不到这一点,则改为以下游戏循环。

http://blorb.tumblr.com/post/236799414/simple-java-android-game-loop

于 2012-10-09T09:10:57.243 回答