我正在阅读一些用于学习目的的基本游戏技术。
我遇到了一些同步访问游戏循环线程上使用的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对象访问画布,然后在绘制画布时将其锁定。 为什么需要同步?
我认为不是,因为请求画布和绘图的唯一线程是游戏循环运行的线程。
同样the documnetation of SurfaceHolder.lockCanvas()说它会在调用unlockCanvasAndPost()之前获取内部锁定,那么为什么要进行额外同步?
答案 0 :(得分:1)
如果你查看你提供的参考文献,完整的引用是:
如果未返回null,则此函数在内部保持锁定,直到相应的unlockCanvasAndPost(Canvas)调用,阻止SurfaceView在绘制时创建,销毁或修改表面。
我的重点 - 请注意,阅读不在列表中。
所以lockCanvas
并不会阻止它被读取。我猜想额外的同步是为了确保其他线程当时没有从中读取 - 这是有道理的,因为你正在调用updatePhysics
,这可能会让其他读者感到不安。
答案 1 :(得分:1)
查看其余的源代码,SurfaceView线程之外的许多其他操作也会在mSurfaceHolder
上同步。因此,我认为mSurfaceHolder
被用作方便的“锁定”。 object用于同步线程和应用程序其余部分之间的状态。