Android 为什么lockCanvas()很慢?

Android 为什么lockCanvas()很慢?,android,surfaceview,android-canvas,Android,Surfaceview,Android Canvas,我正在实现一个SurfaceView子类,在这个子类中,我运行一个单独的线程在SurfaceHolders画布上绘制。 我正在测量调用lockCanvas()前后的时间,从大约70毫秒到100毫秒。 有人能告诉我为什么我会有这么高的时间吗? 以下是守则的相关部分: public class TestView extends SurfaceView implements SurfaceHolder.Callback { .... boolean created; public void sur

我正在实现一个SurfaceView子类,在这个子类中,我运行一个单独的线程在SurfaceHolders画布上绘制。 我正在测量调用
lockCanvas()
前后的时间,从大约70毫秒到100毫秒。 有人能告诉我为什么我会有这么高的时间吗? 以下是守则的相关部分:

public class TestView extends SurfaceView implements SurfaceHolder.Callback {

....

boolean created;
public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

   mThread = new DrawingThread(mHolder, true);
   mThread.onWindowResize(width, height);
   mThread.start();
}

public void surfaceCreated(SurfaceHolder holder) {

    created = true;
}

public void surfaceDestroyed(SurfaceHolder holder) {
    created = false;

}
class DrawingThread extends Thread {
public void run() {
while(created) {



            Canvas canvas = null;
            try {
                            long t0 = System.currentTimeMillis();
            canvas = holder.lockCanvas(null);
            long t1 = System.currentTimeMillis();
                            Log.i(TAG, "Timing: " + ( t1 - t0) );
            } finally {
                holder.unlockCanvasAndPost(canvas);
            }
}
请阅读以下内容:


每次更改曲面时,您都在创建线程。您应该在
surfaceCreated
中启动线程,并在
surfaceDestroyed
中终止它。用于曲面的尺寸更改时

来自SurfaceView。文件:

这将在首次创建曲面后立即调用。这种方法的实现应该启动他们想要的任何渲染代码。请注意,只有一个线程可以绘制到曲面中,因此,如果正常渲染将在另一个线程中进行,则不应在此处绘制到曲面中

多线程可能会使您受到限制。从SurfaceHolder。文件:

如果在曲面未准备就绪时(Callback.surfaceCreated之前或Callback.surfaceDestroyed之后)重复调用此函数,您的调用将被限制为慢速,以避免占用CPU


然而,我不认为这是唯一的问题。
surfaceChanged
是否真的被多次调用?

这与在android图形框架中如何实际实现
lockCanvas
有关


您可能已经知道,
lockCanvas
将返回一个空闲的内存块,用于绘制。通过free,这意味着该内存未用于合成,也未用于显示。简单地说,在内部,SurfaceView由双缓冲区备份,一个用于绘图,一个用于合成/显示。此双缓冲区由BufferQueque管理如果合成/显示比绘图慢,我们必须等到有可用的缓冲区。

好的,谢谢。我以前已经读过了,并且理解了这些概念。但我还没有找到解决办法。即使我删除了
synchronized
块(不推荐),它也帮不了我。还有那些高计时。当医生说,
只有一根线能进入表面时,
。。。这句话应该从表面上看,还是他们在说“……可以同时画进一个表面”,我认为应该从表面上看。即使没有,也必须处理绘图命令的序列化。(这可能就是为什么他们要求你在一条线上提交它们。)据我所说,我是对的(但我们在互联网上只是两个人;)。哦。我绝对喜欢一个好的教程(这个答案链接到)。谢谢我希望我能给你两个+1,你找到解决办法了吗?