我正在閱讀一些用於學習目的的android基本遊戲技巧。在Android遊戲循環中同步
我遇到了一些代碼,用於同步遊戲循環線程上使用的SurfaceHolder對象的訪問,爲什麼這是必要的?
示例代碼SDK /樣品/機器人-18 /遺留髮現/ 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對象在畫布上,然後將其接入在繪製畫布時鎖定。 爲什麼需要同步?
我認爲這不是,因爲請求畫布和繪製它的唯一線程是遊戲循環運行的線程。
也the documnetation of SurfaceHolder.lockCanvas()說,它會獲得一個內部鎖,直到unlockCanvasAndPost()被調用,那麼爲什麼額外的同步?
好的,我理解讀鎖定部分,但是'updatePhysics'是從同一個線程調用的,它是繪製圖形的同一個線程,所以不能併發訪問'mSurfaceHolder'。我仍然不明白。 – Paul
在檢查其同步時,很難辨別程序員的意圖。通常情況下,程序員正在防禦晦澀的競爭,只有當用戶做了一些愚蠢的事情時纔會發生。 「太多鎖定」的唯一真正反對意見是如果結果很慢並且在這種情況下這不太可能成爲問題。總之 - 我會說這是偏執狂(但無傷大雅)編碼。 – OldCurmudgeon