1

別のスレッドでキャンバスに波形をインクリメンタルに描画しようとしています。つまり、スレッドの各ループで、曲線全体を再描画せずに、ハードウェアによって最近取得された部分のみを描画します。

SurfaceHolder.unlockCanvasAndPostと の間に保持されているキャンバスの内容を信頼できるかどうかはわかりませんSurfaceHolder.lockCanvas

ドキュメンテーションはそれについて少し曖昧であるように思われ、私の実験は驚くべき結果をもたらします.描画スレッドの2つの後続のループで返されるキャンバスの「古い」内容は異なります. 2つのキャンバスが交互に使用されているように見えます(ただし、確認しました-同じキャンバスですが、内容が異なります)。

この動作を再現するために私が見つけた最も簡単な方法:

  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 句をよく確認してください。たぶん、真と偽が交互になっているかもしれません。これにより、オブジェクトが描画されてから描画されなくなるということが、立て続けに発生します。

ブール値を出力する必要がある場合は、ログを使用して、ブール値が変化しているかどうかを確認します。

これに失敗すると、代わりに次のゲーム ループが発生します。

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

于 2012-10-09T09:10:57.243 に答える