8

SurfaceView サブクラスを実装しており、別のスレッドを実行して SurfaceHolders Canvas に描画します。への呼び出しの前後の時間を測定していますがlockCanvas()、約 70ms から 100ms になっています。なぜ私がこんなに高いタイミングを得ているのか、誰かが私に指摘できますか? コードの関連部分は次のとおりです。

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 から。surface作成されたドキュメント:

これは、サーフェスが最初に作成された直後に呼び出されます。これの実装は、必要なレンダリング コードを起動する必要があります。Surface に描画できるのは 1 つのスレッドだけであることに注意してください。したがって、通常のレンダリングが別のスレッドで行われる場合は、ここで Surface に描画しないでください。

複数のスレッドにより、おそらくスロットルがかかっています。SurfaceHolder から。lockCanvasドキュメント:

Surface の準備ができていないときにこれを繰り返し呼び出すと (Callback.surfaceCreated の前または Callback.surfaceDestroyed の後)、 CPU の消費を避けるために、呼び出しは低速に調整されます。

ただし、これが唯一の問題であるとは確信していません。surfaceChanged実際に複数回呼び出されますか?

于 2011-08-09T01:16:55.427 に答える
1

これを読む:

lockCanvas とはどういう意味ですか (精巧)

于 2011-05-16T07:25:06.450 に答える