私はレンダラーをプロファイルしようとしています。私は説明できない奇妙なプロファイリングの動作を見ています。なぜglClearはOpenGLESでブロックされていますか?
私はglSurfaceViewを使用しています。これは、レンダリングを連続して行うように設定しています。私onDrawFrame()
が
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
を構造化する方法を
これはこれは、軽負荷の下でゆっくりと動作したので、私はTimerクラスを作成し、この一部をプロファイルするために始めました。私は私が見たものにはかなり驚いていました。
public void onDrawFrame(GL10 unused) {
swapTimer.end();
clearTimer.start();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
clearTimer.end();
drawTimer.start();
executeAllDrawCommands();
drawTimer.end();
swapTimer.start();
}
clearTimer
対策、それはそれはすべて私の描画呼び出しを実行するのにかかる時間にglClear、drawTimer
対策を呼び出すのにかかる時間、およびswapTimer
対策時間:
私は非常に負荷の軽いシーンを実行したとき、私は私が説明することはできませんいくつかの本当に奇妙な数字だ:私は、デバイスはvsyncの強制を持っていると信じて、私は、スワップ時間はやや大きめであることが予想
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
を実際の「クリア」コールが11ミリ秒間ブロックされている理由はわかりませんが、約30fpsで有効にしていますか?私はそれがちょうど非同期コマンドを発行し、返すと考えられていたと思った?このシーンで
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
私の描画呼び出しは、そのは、VSYNC期間の多くを隠すようになっていることに多くの時間を取っている:
私はずっと忙しいシーンを描くときは、数字はかなりの変更クリアコールのブロックは完全に消えてしまいます。
軽くロードされたシーンでglClearがブロックされている理由は何ですか?私の「Timerのクラスのソースコードへ
リンク誰かが私の測定技術の不審である場合には:http://pastebin.com/bhXt368W
clearTimer.start()メソッドの前にGLES20.glFinish()を呼び出して時間の変化を確認できますか? –
私は 'glFinish'(とその周りにfinishTimer.start()/ end()を置く)、それはglClearから常に離れています。代わりにglFinishは数ミリ秒かかるので、glClearは即座になります。これはvsyncに関連しているようですが、vsyncの時刻がglClearの内部に表示されるのは驚きました。 – Tim