11

1つのキャンバスにmsごとに何かを描画しようとしています。つまり、フレームごとにすべてを再描画するのではなく、キャンバスに詳細を追加するだけです。したがって、このコードは3つの異なるキャンバスを提供します。第三に、そして最初にもう一度。なんで?

public void run() {
    this.run = true;
    Canvas canvas = null;
    while (run) {
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (this.surfaceHolder) {
                Thread.sleep(delay);
                draw(new Img(canvas, size));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
            this.surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
        synchronized (this) {
            if (wait) {
                try {
                    wait();
                } catch (Exception e) {}
            }
        }
    }
}

それがアンドロイドトリプルバッファリングである場合-それをオフにする方法、またはそれで何かをする方法は?Android 4.2.1

4

2 に答える 2

2

以前の描画を保持したい場合は、それらをオフスクリーンキャンバスに描画し、ロックキャンバスから取得したキャンバスに描画する必要があります。

アイデアを説明するためのpuesdコード:

Bitmap offScreenBitmap = Bitmap.createBitmap(100,200,Bitmap.ARGB_8888);
Canvas offScreenCanvas = new Canvas(offScreenBitmap);

onScreenCanvas = this.surfaceHolder.lockCanvas();

//always draw to te offScreenCanvas
offScreenCanvas.drawXxxx

//copy the data to on-screen canvas you got from the lock
onScreenCanvas.drawBitmap(offScreenBitmap);

unlockAndPost(onScreenCanvas)

それはあなたの仕事を成し遂げるはずです。右?

次に、ボンネットの下に少し:

はい、Androidビュー(サーフェスISビュー)には複数のバッファーがあります。1つはアプリが描画に使用し、もう1つはシステムがレンダリングに使用します。また、アプリがタイムリーに描画を完了できない場合は、3つ目のバッファーがあります。それをオフにする方法はなく、あなたはそれをオフにしたくないでしょう。そして、それはあなたがすでに観察したようにロックするときにあなたが異なるキャンバスを得る理由です。

于 2013-04-30T12:37:28.207 に答える
1
  1. Runnable実装(メソッドがvoidを返す)でブールフィールドに「run」という名前を付けることはお勧めしません。紛争から問題が表面化しないとしても、それは混乱を招きます。たぶん、「実行中」または何か(何か)の方が理にかなっているでしょう-デバッグが簡単です。

  2. マルチスレッドの場合は、Object.waitを使用しないでください。常に(一般的には)期待どおりに機能するとは限りません。

  3. Canvasメンバーの複数のインスタンスを取得している可能性があります。これは、どこか(Androidフレームワーク内、またはコード内など)で、「新しいCanvas(args)」が呼び出されているためです。 Canvasインスタンスのみが別のスレッドにあります。参照は1つだけですが、複数のインスタンスを作成できます。

  4. 同期(何でも)を使用する必要があることが確実でない限り、使用することはお勧めしません。

  5. 頑張れ。この問題は非常に紛らわしいです-私は去年の春にそれを解決しました、そしてそれは簡単でも面白くもありませんでした。

上記のいずれかが何らかの形で役立つことを願っています。

-ブランドン

于 2013-01-19T03:29:22.917 に答える