2012-01-05 25 views
3

私はこれらのメソッドを呼び出すたびに、処理に14-20msかかるでしょう。SurfaceHolder.lockCanvas()が高すぎる

Canvas canvas = holder.lockCanvas(); 
holder.unlockCanvasAndPost(canvas); 

これは正常な動作ですか? 別のアプローチをとるべきですか?

01-05:15:49:20.322:I /のSystem.out(4892):フレーム時間:ここ

全体コード

public class Render extends SurfaceView { 
    Context c = null; 
    SurfaceHolder holder; 
    volatile boolean running = true; 

    public Render(Context c) { 
     super(c); 
     this.c = c; 
     this.holder = getHolder(); 
    } 

    public void run() { 
     if(running) { 
      if(!holder.getSurface().isValid()){ 
       System.out.println("not valid"); 
       return;   
      } 

      Canvas canvas = holder.lockCanvas(); 
      holder.unlockCanvasAndPost(canvas); 

     } 
    } 
} 

トレースである0秒frame291
01- 05/15:49:20.322:I/System.out(4892):無効
01-05 15:49:20.322:I/System.out(4892):フレーム時間:0 msフレーム292
01-05 15 :49:20.332:I/System.out(4892):フレーム時間:2msフレーム293
01-05 15:49:20.357: I/System.out(4892):フレーム時間:22ms frame294
01-05 15:49:20.357:I/System.out(4892):フレーム時間:1msフレーム295
01-05 15:49: 20.362:I/System.out(4892):フレーム時間:1msフレーム296
01-05 15:49:20.367:D/CLIPBOARD(4892):開始入力時にクリップボードのダイアログを非表示にする。
01-05 15:49:20.367:I/System.out(4892):フレーム時間:8msフレーム297
01-05 15:49:20.377:I/System.out(4892):フレーム時間:10 ms /秒frame298
01-05 15:49:20.397:I/System.out(4892):フレーム時間:16ms frame299
01-05 15:49:20.412:I/System.out(4892):フレーム時間:16ミリframe300
01-05 15:49:20.427:I /をSystem.out(4892):フレーム時間:私は、OpenGL

を使用するときに16ミリframe301

UPDATE


同じことがhapens
package android.apps.td; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 

public class Render extends GLSurfaceView implements Renderer { 

    private final int MILLION = 1000000; 
    private long frame; 

    public Render(Context context) { 
     super(context); 
     setRenderer(this); 
     // TODO Auto-generated constructor stub 
    } 

    public void onDrawFrame(GL10 arg0) { 
     System.out.println("Frame "+(System.nanoTime()-frame)/MILLION+" ms"); 
     frame = System.nanoTime(); 
    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     System.out.println("Surface changed w:"+width+" h:"+height); 
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     System.out.println("Surface created"); 
    } 
} 
+1

あなたはそれらの間で何をしていますか? – dbryson

+0

これらの2つのメソッドを呼び出すだけで遅延が発生します。 – jellyfication

答えて

0

私はこの問題を自分で調べています。私はギャラクシータブGT-P7500に見出さする

  • unlockCanvasAndPost + lockCanvasのペア間の最小時間は秒又は17ミリ秒の1/60であることでした。
  • ただし、最大6 msの作業が可能で、フレームレートは60 fpsのままです。
  • ページフリップ(unlockCanvasAndPost + lockCanvas)にかかる最短時間は約3ミリ秒です。
  • 6 msを超えると、lockCanvas()関数は、フレームレートを強制的に40 fps、30 fps、20 fps、または15 fpsにする追加の遅延を導入することがあります。最悪の場合、ページフリップは1/60秒より長くかかります。たとえば、1フレームあたり48ミリ秒の作業(ページフリップに3ミリ秒を追加すると、20フレーム/秒で十分に高速ではありません)の場合、フレームフリップを19〜20ミリ秒で無駄にしてフレームレートを15に強制しますフレーム/秒。 15fps未満では、ページフリップが一貫して17msecかかることがあります。
  • この現象は必ずしも起こりません。ベンチマークでこの振る舞いを観察した後、私はさらに調査するために専用の活動を作成し、その専用の活動で現象は発生しませんでした。これまでのところ、私は元のベンチマークと新しいものとの違いを理解できませんでした。どちらもワーカースレッドのSurfaceViewにフレームを描画しますが、2番目のアクティビティでは、ページフリップは3 msを最初のページフリップは最初は3ミリ秒かかりますが、約1/2秒後に突然上昇し、定常状態では最大20ミリ秒になります。
  • 壁の電源に差し込んでも違いはありません。
関連する問題