8

我正在实现一个 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);
            }
}
4

3 回答 3

5

每次更改表面时,您都会创建一个线程。你应该开始你的线程surfaceCreated并杀死它surfaceDestroyedsurfaceChanged用于当您的表面尺寸发生变化时。

来自 SurfaceView。surfaceCreated文档:

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

多个线程可能会让您受到限制。来自 SurfaceHolder。lockCanvas文档:

如果在 Surface 未准备好时(在 Callback.surfaceCreated 之前或 Callback.surfaceDestroyed 之后)重复调用它,您的调用将被限制为较慢的速率以避免消耗 CPU。

但是,我不相信这是唯一的问题。surfaceChanged实际上会被多次调用吗?

于 2011-08-09T01:16:55.427 回答
2

This is related to how lockCanvas is actually implemented in the android graphic framework.

You should probably already know that lockCanvas will return you an free piece of memory that you will be used to draw to. By free, it means this memory has not be used for composition and not for display. Internally, simply speaking, an SurfaceView is backed up by double buffer, one is for drawing , one is for composition/display. This double buffer is managed by BufferQueque. If composition/display is slow than drawing, we have to wait until we have free buffer available.

于 2013-08-07T01:54:50.233 回答
1

读这个:

lockCanvas 是什么意思(详解)

于 2011-05-16T07:25:06.450 回答