我正在为Android动态壁纸实现渲染循环。我在Internet上找到的所有示例都包含一个渲染循环,如下所示:

public void run() {
    while (mRunning) {
        Canvas c = null;
        try {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                doUpdate();
                doDraw(c);
            }
        } finally {
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}


我是否真的需要在动态壁纸中的mSurfaceHolder对象上进行同步?

像这样的问题已经在here前面讨论过,但是没有给出确切的答案。同样,Jason Nichols here的答案指出:


  我不明白为什么要在渲染循环中进行同步。这是一种不好的形式,因为它可能会锁定您的渲染线程,如果该应用由于某种原因无法立即获得锁定,则该应用似乎会冻结。获取锁也需要时间。
  
  如果您以需要锁定渲染线程的方式来组织数据,则需要重构设计。


我真的很沮丧!

更新资料

我通常需要在渲染循环中进行任何同步吗?对渲染循环性能有多大影响?

最佳答案

您无需在mSurfaceHolder上进行同步。此代码可能取自SDK的Lunar Lander示例,并且在网络上更改了很多次,以至于失去了上下文。已选择SurfaceHolder作为提供内部锁定的对象,但是也可以使用任何其他对象。

10-07 19:20
查看更多