Android 我真的需要在实时墙纸的渲染循环中同步SurfaceHolder吗
我正在安卓系统中为我的实时壁纸实现一个渲染循环。我在Internet上找到的所有示例都包含这样的渲染循环:Android 我真的需要在实时墙纸的渲染循环中同步SurfaceHolder吗,android,performance,live-wallpaper,Android,Performance,Live Wallpaper,我正在安卓系统中为我的实时壁纸实现一个渲染循环。我在Internet上找到的所有示例都包含这样的渲染循环: public void run() { while (mRunning) { Canvas c = null; try { c = mSurfaceHolder.lockCanvas(null); synchronized (mSurfaceHolder) { doUpd
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);
}
}
}
}
Handler handler = new Handler(Looper.getMainLooper());
我真的需要在实时壁纸中同步mSurfaceHolder
对象吗
像这样的问题在前面已经讨论过了,但是没有给出确切的答案。Jason Nichols
的回答也指出:
我不明白为什么要在渲染循环中同步。这是一种糟糕的形式,因为它可能会锁定渲染线程,导致应用程序在由于任何原因无法立即获得锁定时出现冻结。获取锁也需要时间
如果数据的组织方式需要锁定渲染线程,则需要重构设计
我真的很沮丧
使现代化
我通常需要渲染循环中的任何同步吗?它对渲染循环性能的影响有多大?您不需要在
mSurfaceHolder
上同步。此代码可能取自SDK中的Lunar Lander示例,在web上更改了很多次,以至于失去了上下文SurfaceHolder
已被选择为提供内部锁的对象,但也可以使用任何其他对象。您不需要在mSurfaceHolder
上同步。此代码可能取自SDK中的Lunar Lander示例,在web上更改了很多次,以至于失去了上下文SurfaceHolder
已被选为提供内部锁的对象,但也可以使用任何其他对象。实际上这很简单。在大多数使用同步的示例中,这是因为有可能从多个线程(主线程和一些辅助线程)访问doUpdate()
和doDraw()
方法
但是,如果您可以确保这些方法只能从同一个线程访问,则根本不需要使用同步
一个简单的实现(也是对性能最好的实现)是使用如下处理程序:
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);
}
}
}
}
Handler handler = new Handler(Looper.getMainLooper());
这将把处理程序绑定到主线程,并且所有操作都将只在主线程上进行
因此,当您真正想要同步某些内容时,请使用“同步”。实际上,这非常简单。在大多数使用同步的示例中,这是因为有可能从多个线程(主线程和一些辅助线程)访问
doUpdate()
和doDraw()
方法
但是,如果您可以确保这些方法只能从同一个线程访问,则根本不需要使用同步
一个简单的实现(也是对性能最好的实现)是使用如下处理程序:
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);
}
}
}
}
Handler handler = new Handler(Looper.getMainLooper());
这将把处理程序绑定到主线程,并且所有操作都将只在主线程上进行
因此,如果您确实想同步某些内容,请使用“同步”。感谢您详细解答我的问题!我通常需要在渲染循环中进行同步吗?如果使用两个单独的线程,则必须进行某种同步。我知道你在担心表现。首先,做你想做的事情,看看你是否真的在性能上有问题。如果您担心“同步”,请查看GLSurfaceView源代码-它有一个渲染循环(guarderun())-查看它是如何编写的。感谢您详细询问我的问题!我通常需要在渲染循环中进行同步吗?如果使用两个单独的线程,则必须进行某种同步。我知道你在担心表现。首先,做你想做的事情,看看你是否真的在性能上有问题。如果您担心“已同步”,请检查GLSurfaceView源代码-它有一个渲染循环(guarderun())-查看它是如何编写的。