学習目的で 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() が呼び出されるまで内部ロックを取得すると書かれていますが、なぜ追加の同期が行われるのでしょうか?