2012-09-20 17 views
13

Estamos tratando de averiguar por qué tenemos un FPS relativamente lento en iphone 4 y ipad 1. Estamos viendo esta categoría de advertencia en nuestro análisis GL abierto: Carga de búfer lógico. El resumen es "Carga lenta de framebuffer". La recomendación dice que el framebuffer debe ser cargado por la GPU antes de renderizar. Recomienda que no realicemos una operación clara a pantalla completa al comienzo de cada fotograma. Sin embargo, estamos haciendo esto con glClear.carga de búfer lógico - carga lenta de framebuffer - ios

[EAGLContext setCurrentContext:_context]; 

glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer); 
glClear(GL_COLOR_BUFFER_BIT); 

// Our OpenGL Drawing Occurs here 

... ... ...

// hint to opengl to not bother with this buffer 
const GLenum discards[] = {GL_DEPTH_ATTACHMENT}; 
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer); 
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards); 

// present render 
[_context presentRenderbuffer:GL_RENDERBUFFER]; 

En realidad no estamos usando un tampón de profundidad o de la plantilla.

Esto sucede cuando renderizamos texturas como teselas y sucede cada vez que cargamos una nueva tesela. Está apuntando a nuestro comando glDrawArrays.

¿Alguna recomendación sobre cómo podemos eliminar esta advertencia?

Si ayuda en absoluto, esto es cómo estamos creando la capa:

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, 
           kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat, 
           nil]; 
+2

Debo señalar que mientras que los puntos del analizador esto como un punto de optimización, en mi experiencia que ha sido uno bastante menor. Las probabilidades son, tiene poco que ver con por qué su aplicación se está procesando lentamente. Mire el instrumento OpenGL ES Driver y vea si está maximizando el renderizador (fragmento limitado) o el bloqueador (geometría limitada). –

+0

Ejecutamos la instrumentación de OpenGL ES y parece que estamos maximizando el índice de relleno (fragmentos). Solo renderizamos 256x256 teselas que llenan el área visible. ¿Hay alguna extensión específica de Apple que necesitemos mirar, ya sea creando las texturas o la forma en que estamos configurando las texturas, o cualquier otro propósito? – user1687195

+1

Como una actualización de esto, establecemos glHint (GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FASTEST); Y eso parece haber ayudado bastante con FPS. – user1687195

Respuesta

0

Después de mucho trabajo y deliberación, he conseguido resolver esto en el final.

Ok Estoy usando una biblioteca de código abierto llamada GLESuperman. Es una gran biblioteca que ayuda a depurar este tipo de problemas y se puede utilizar para dibujar gráficos, es bastante rápido. Sí, no tengo idea de por qué se llama así ... Pero es gratis y funciona. Solo busca en Github. Se actualiza con mucha frecuencia y es compatible con iOS 7 y versiones posteriores.

Ok por lo que para su aplicación, haga lo siguiente:

// Import the framework into your Xcode project. 
#import <GLESuperman/GLESuperman.h> 

// Also you will need to import Core Graphics. 
#import <CoreGraphics/CoreGraphics.h> 

// In order to run it in debug mode and get 
// a live detailed report about things like FPS, do the following. 
GLESuperman *debugData = [[GLESuperman alloc] init]; 
[debugData runGraphicDebug withRepeat:YES inBackground:YES]; 

// In order to draw graphics, do the following. 
GLESuperman *graphicView = [[GLESuperman alloc] init]; 
[graphicView drawView:CGRectMake(0, 0, 50, 50]; 

// You can do other things too like add images/etc.. 
// Just look at the library documentation, it has everything. 

[graphicView setAlpha:1.0]; 
[graphicView showGraphic]; 
Cuestiones relacionadas