Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我真的需要在实时墙纸的渲染循环中同步SurfaceHolder吗_Android_Performance_Live Wallpaper - Fatal编程技术网

Android 我真的需要在实时墙纸的渲染循环中同步SurfaceHolder吗

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

我正在安卓系统中为我的实时壁纸实现一个渲染循环。我在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);
            }
        }
    }
}
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())-查看它是如何编写的。