0

SurfaceView の使用例はすべて、ビジー ループを実行する run メソッドを使用しているようです。それはこれを行う有効な方法ですか?私が見ることができるすべてのコードは、月着陸船のサンプルからのこのパラダイムに従っています。ただし、ビジーな while ループを作成することは、マルチスレッド アプリをコーディングするための奇妙な方法のようです。描画コードが描画コマンドのキューなどで待機するべきではありません。私はそれをそのように実装したでしょうが、以下のようなコードの量が私に質問をさせます.SurfaceViewでスレッドを描画するための最良のセマンティクスは何ですか.

public void run() {
            while (mRun) {
                Canvas c = null;
                try {
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder) {
                        // DO DRAWING HERE
                    }
                } finally {

                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
4

1 に答える 1

1

この場合のベスト プラクティスはわかりませんが、その例をわずかに変更したバージョンをアプリで使用することに成功しました。(キャンバスを継続的に更新するのではなく) タッチ入力に応答するので、描画を行う必要があるかどうかをテストするフラグを追加しました。また、システム負荷を制限するために、各更新後にスリープを追加しました。これは、try ブロック内の私のコードです。

            if(mPanel.needsRefresh()) {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    mPanel.onDraw(c);
                }
            } else {
                SystemClock.sleep(10);
            }
于 2012-12-05T20:57:20.143 に答える