Ich versuche, meinen Renderer zu profilieren, und sehe ein seltsames Profiling-Verhalten, das ich nicht erklären kann.Warum blockiert GlClear in OpenGLES?
Ich benutze eine glSurfaceView, die ich eingestellt habe, um kontinuierlich zu rendern.
Dies ist, wie mein onDrawFrame()
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
Dies wurde langsam unter geringer Last zu verhalten, so habe ich eine Timer-Klasse und den Autor diese einige profilieren. Ich war ziemlich überrascht von dem, was ich sah.
Ich habe ein paar Sonden auf meine onDrawFrame Methode wie folgt:
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
misst die Zeit, glClear, drawTimer
misst die Zeit, alle Anrufe meine Unentschieden zu laufen braucht, um Anruf entgegennimmt, und swapTimer
misst die Zeit ab wann onDrawFrame beendet wird und wann es zurückkehrt (die Zeit, die für den Aufruf von eglSwapBuffers benötigt wird).
Wenn ich eine sehr leicht belastet Szene lief, bekam ich ein paar wirklich seltsame Zahlen, die ich nicht erklären kann:
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
ich die Swap-Zeit erwartet etwas largish zu sein, da ich das Gerät hat Vsync gezwungen glauben Aktivieren Sie bei ~ 30fps, obwohl ich nicht weiß, warum der tatsächliche 'freie' Anruf für 11 Millisekunden blockiert wird? Ich dachte, es sollte nur einen asynchronen Befehl ausgeben und zurückgeben?
Wenn ich eine viel mehr damit beschäftigt Szene zeichnen, die Zahlen etwas ganz ändern:
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
so viel Zeit, um meine Auslosung Anrufe nehmen In dieser Szene, dass es wie sein sieht viel von der VSYNC-Periode versteckt , und der Block des Anrufs verschwindet vollständig.
Gibt es eine Erklärung dafür, warum glClear auf meiner leicht belasteten Szene blockiert?
Link zu meinem 'Timer' Klasse Quellcode, falls jemand verdächtig ist meine Messtechnik: http://pastebin.com/bhXt368W
Könnten Sie versuchen, GLES20.glFinish() vor der Methode clearTimer.start() aufzurufen und zu sehen, wie sich die Zeit dann ändert? –
Ich habe eine 'glFinish' (und finishTimer.start()/end()), und es dauert die ganze Zeit weg von GlClear. Statt dessen benötigt glFinish nun einige Millisekunden und glClear wird sofort. Es sieht so aus, als ob dies alles mit vsync zusammenhängt, obwohl ich überrascht war, dass vsync-Zeit innerhalb von glClear erscheint. – Tim