2012-09-20 6 views
13

Wir versuchen herauszufinden, warum wir eine relativ langsame FPS auf iphone 4 und ipad 1 haben. Wir sehen diese Kategorie der Warnung in unserer offenen GL-Analyse: Logical Buffer Load. Die Zusammenfassung lautet "Slow framebuffer load". Die Empfehlung besagt, dass der Framebuffer vor dem Rendern von der GPU geladen werden muss. Es wird empfohlen, dass wir zu Beginn eines jeden Frames keinen Vollbild-Löschvorgang durchführen. Wir machen dies jedoch mit glClear.logischer Puffer laden - langsamer Framebuffer laden - 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]; 

Wir sind eigentlich keine Tiefe oder Schablonenpuffer.

Dies passiert, wenn wir Texturen als Kacheln rendern und es jedes Mal passiert, wenn wir eine neue Kachel laden. Es zeigt auf unseren Befehl glDrawArrays.

Irgendwelche Empfehlungen, wie wir diese Warnung loswerden können?

Wenn es überhaupt hilft, das ist, wie wir die Ebene einrichten:

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

Ich sollte beachten, dass während der Analysator diese Punkte als ein Punkt der Optimierung aus, in meiner Erfahrung eine ziemlich geringfügige es war. Odds sind, es hat wenig damit zu tun, warum Ihre Anwendung langsam rendert. Sehen Sie sich den OpenGL ES Driver an und sehen Sie, ob Sie den Renderer (fragment limited) oder den Tiler (geometry limited) ausreizen. –

+0

Wir haben die OpenGL-ES-Instrumentierung ausgeführt und es scheint, dass wir die Füllrate (Fragmente) maximieren. Wir rendern nur 256x256 Kacheln, die den sichtbaren Bereich ausfüllen. Gibt es irgendwelche Apple-spezifischen Erweiterungen, die wir betrachten müssen, ob das die Erstellung der Texturen oder die Art, wie wir die Texturen einrichten, oder ein anderer Zweck? – user1687195

+1

Als Update hierfür setzen wir glHint (GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FASTEST); Und das scheint mit FPS ziemlich geholfen zu haben. – user1687195

Antwort

0

Nach vieler Arbeit und Beratung gelang es mir, das am Ende herauszufinden.

Ok Ich verwende eine Open-Source-Bibliothek namens GLESuperman. Es ist eine großartige Bibliothek, die hilft, diese Art von Problemen zu beheben, und es kann zum Zeichnen von Grafiken verwendet werden - es ist ziemlich schnell. Ja ich habe keine Ahnung warum das so heißt ... Aber es ist kostenlos und es funktioniert. Suche es einfach auf Github. Es wird sehr häufig aktualisiert und unterstützt iOS 7 und höher.

Ok, so dass es zu implementieren, gehen Sie wie folgt vor:

// 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];