レンダラーのプロファイリングを試みていますが、説明できない奇妙なプロファイリング動作が見られます。
継続的にレンダリングするように設定したglSurfaceViewを使用しています。
これが私のonDrawFrame()
構造です
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
これは軽負荷でゆっくりと動作していたので、タイマークラスを作成し、これをプロファイルし始めました。私は自分が見たものにかなり驚いた。
次のように、onDrawFrameメソッドにいくつかのプローブを配置します。
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
測定し、onDrawFrameが終了してから戻るまでの時間(eglSwapBuffersの呼び出しにかかる時間)を測定します。
非常に軽い負荷のシーンを実行したとき、説明できない非常に奇妙な数字がいくつか表示されました。
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
実際の「クリア」呼び出しが11ミリ秒ブロックされている理由はわかりませんが、デバイスのvsyncが約30 fpsで強制的に有効になっていると思われるため、スワップ時間はやや長いと予想しました。非同期コマンドを発行して戻ることになっていると思いましたか?
もっと忙しいシーンを描くと、数字はかなり変わります。
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
このシーンでは、描画呼び出しに時間がかかりすぎて、vsync期間の多くが隠れているように見え、クリア呼び出しのブロックが完全になくなります。
負荷の軽いシーンでglClearがブロックされている理由について何か説明はありますか?
誰かが私の測定技術に疑いを持っている場合に備えて、私の「タイマー」クラスのソースコードへのリンク:http://pastebin.com/bhXt368W