我正在阅读一些用于学习目的的 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(),那么为什么要额外同步?