我正在实现一个surfaceview子类,在这里我运行一个单独的线程来绘制到surfaceholders画布上。
我在测量通话前后的时间,从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文档:
这在第一次创建曲面后立即调用。实现它应该启动他们想要的任何呈现代码。请注意,只有一个线程可以绘制到一个曲面中,因此如果您的正常渲染将在另一个线程中,则不应在此处绘制到该曲面中。
多线程可能会让您受到限制。来自surfaceholder.lockCanvas文档:
如果在surface未准备好时(callback.surfacecreated之前或callback.surfacedestroyed之后)重复调用此函数,则会将调用限制为慢速,以避免消耗CPU。
不过,我不认为这是唯一的问题。surfaceChanged
是否被多次调用?