4

学習目的で Android の基本的なゲーム テクニックについて読んでいます。

ゲーム ループ スレッドで使用される SurfaceHolder オブジェクトへのアクセスを同期するコードを見つけました。なぜこれが必要なのですか?

sdk/samples/android-18/legacy/LunarLanderクラスにあるサンプル コードLunarView.LunarThread:

public void run() {
    while (mRun) {
        Canvas c = null;
        try {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                if (mMode == STATE_RUNNING) updatePhysics();
                    synchronized (mRunLock) {
                        if (mRun) doDraw(c);
                    }
                }
        } finally {
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}

したがって、このコードは mSurfaceHolder オブジェクトからキャンバスへのアクセスを取得し、キャンバスが描画されている間はロックされます。なぜ同期が必要なのですか?

キャンバスを要求して描画する唯一のスレッドは、ゲームループが実行されるスレッドであるため、そうではないと思います。

また、SurfaceHolder.lockCanvas() のドキュメントには、unlockCanvasAndPost() が呼び出されるまで内部ロックを取得すると書かれていますが、なぜ追加の同期が行われるのでしょうか?

4

2 に答える 2

1

ソース コードの残りの部分を見ると、SurfaceView スレッド以外の他の多くの操作も で同期されていmSurfaceHolderます。したがってmSurfaceHolder、スレッドとアプリケーションの残りの部分との間で状態を同期するための便利な「ロック」オブジェクトとして使用されていると思います。

于 2013-09-23T15:01:54.777 に答える