android游戏循环中的同步

时间:2013-09-23 14:04:50

标签: java android multithreading synchronization thread-safety

我正在阅读一些用于学习目的的基本游戏技术。

我遇到了一些同步访问游戏循环线程上使用的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()之前获取内部锁定,那么为什么要进行额外同步?

2 个答案:

答案 0 :(得分:1)

如果你查看你提供的参考文献,完整的引用是:

  

如果未返回null,则此函数在内部保持锁定,直到相应的unlockCanvasAndPost(Canvas)调用,阻止SurfaceView在绘制时创建,销毁或修改表面

我的重点 - 请注意,阅读不在列表中。

所以lockCanvas并不会阻止它被读取。我猜想额外的同步是为了确保其他线程当时没有从中读取 - 这是有道理的,因为你正在调用updatePhysics,这可能会让其他读者感到不安。

答案 1 :(得分:1)

查看其余的源代码,SurfaceView线程之外的许多其他操作也会在mSurfaceHolder上同步。因此,我认为mSurfaceHolder被用作方便的“锁定”。 object用于同步线程和应用程序其余部分之间的状态。

相关问题