为什么lockCanvas()慢?

| 我正在实现一个SurfaceView子类,在其中运行一个单独的线程以绘制到SurfaceHolders Canvas上。 我正在测量调用
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
中杀死线程。
surfaceChanged
用于表面尺寸变化时。 从SurfaceView.surfaceCreated文档:   首次创建表面后立即调用此方法。此实现应启动所需的任何渲染代码。请注意,只有一个线程可以绘制到Surface中,因此,如果正常渲染将在另一个线程中,则不应在此处绘制Surface。 多线程可能使您受阻。从SurfaceHolder.lockCanvas文档中:   如果在Surface未准备好时(在Callback.surfaceCreated之前或Callback.surfaceDestroyed之后)重复调用此方法,则会将调用限制为较慢的速率,以避免消耗CPU。 但是,我不认为这是唯一的问题。
surfaceChanged
实际上被多次叫过吗?     
这与在Android图形框架中实际实现“ 6”有关。 您可能已经知道ѭ6将会为您返回一块免费的记忆,您将可以使用它来吸引他们。如果免费,则意味着该内存尚未用于合成和显示。在内部,简单地说,SurfaceView由双缓冲区备份,一个用于绘图,一个用于合成/显示。此双缓冲区由BufferQueque管理。如果合成/显示比绘图慢,我们必须等到可用缓冲区可用。     
读这个: lockCanvas是什么意思(详细说明)     

要回复问题请先登录注册