2011-03-29 16 views
6

Slogging a través de la lista de advertencias de rendimiento de uso de la API OpenGL dada por el instrumento Analyze, estoy descubriendo que estamos generando varias cargas de buffer lógico por frame - lugares donde no estamos borrando un buffer porque llamada lo sobrescribe por completo.iOS OpenGL ES Logical Buffer Loads

Contrariamente, la introducción de glClear() llamadas para estos casos simplemente mueve la ubicación de la advertencia a las llamadas glClear(). Apple implementa GL_EXT_discard_framebuffer, sin embargo, usar esto por sí solo tampoco es suficiente para detener la advertencia. Un glDiscardFramebufferEXT() seguido por un glClear() detiene la advertencia y mejora el rendimiento de manera significativa, pero la llamada glClear() tarda tiempo en borrar el búfer, que en nuestro caso de uso es una operación redundante.

¿Otros también encuentran que necesitan llamar a ambas funciones para evitar el costo de recarga o me falta algo? ¿Hay alguna manera barata de insinuarle a OpenGL que el contenido del framebuffer está a punto de sobrescribirse y por lo tanto no necesita volver a cargarse en la memoria?

Respuesta

4

La documentación implica que una pantalla completa glClear() establece una bandera mágica, que es coherente con lo que he visto al depurar el mismo problema. No me preocuparía hacer un glClear redundante(), ya que este es el patrón de uso previsto de lo que puedo decir.

Actualización: También es posible que experimente el mismo error que tenía, donde estaba borrando los búferes de color y profundidad, pero olvidé configurar glDepthMask (GL_TRUE) antes de llamar a glClear(). Esto dio como resultado una advertencia de Carga de búfer lógico.