Estoy tratando de perfilar mi procesador, y estoy viendo un comportamiento de perfil extraño que no puedo explicar.¿Por qué se bloquea glClear en OpenGLES?
Estoy usando un glSurfaceView, que he configurado para representar continuamente.
Así es como mi onDrawFrame()
está estructurado
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
Esto se comportaba lentamente con una carga ligera, así que creé una clase temporizador y comenzó a Profile alguna. Estaba bastante sorprendido por lo que vi.
os pongo unas sondas en mi método onDrawFrame así:
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
mide el tiempo que tarda en llamar glClear, drawTimer
mide el tiempo que tarda en ejecutar todas mis llamadas dibujar, y swapTimer
mide el tiempo desde cuando sale onDrawFrame y cuando vuelve (el tiempo necesario para llamar a eglSwapBuffers).
Cuando me encontré con una escena muy poca carga, que tiene unos números realmente extraño que no puedo explicar:
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
que esperaba el momento de intercambio a ser algo bastante grande, ya que creo que el dispositivo tiene VSYNC forzada habilitar a ~ 30fps, aunque no sé por qué la llamada real "clara" está bloqueando durante 11 milisegundos? Pensé que se suponía que debía emitir un comando asíncrono y regresar?
Cuando dibujo una escena mucho más ocupados, los números cambian un poco:
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
En esta escena mis llamadas de sorteo están tomando tanto tiempo que parece que está ocultando una gran parte del período de VSYNC , y el bloqueo en la llamada clara desaparece por completo.
¿Hay alguna explicación de por qué glClear está bloqueando en mi escena con poca carga?
enlace a mi 'Contador' código fuente de la clase en caso de que alguien es sospechoso de mi técnica de medición: http://pastebin.com/bhXt368W
Podría intentar llamar a GLES20.glFinish() antes de clearTimer.start método() y ver cómo cambia el tiempo, entonces? –
pongo un 'glFinish' (y finishTimer.start()/fin() alrededor de ella), y se lleva todo el tiempo fuera de glClear. En cambio, ahora glFinish tarda algunos milisegundos, y glClear se vuelve instantáneo. Parece que esto es todo lo relacionado con VSYNC, aunque me sorprendió ver el tiempo VSYNC aparecer dentro de glClear. – Tim