我正在为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
作为提供内部锁定的对象,但是也可以使用任何其他对象。