2012-09-20 15 views
13

Próbujemy ustalić, dlaczego mamy stosunkowo powolny FPS na iPhone 4 i ipad 1. Widzimy tę kategorię ostrzeżeń w naszej otwartej analizie GL: Logical Buffer Load. Podsumowanie to "Powolne ładowanie bufora ramki". Zalecenie mówi, że framebuffer musi być załadowany przez GPU przed renderowaniem. Zaleca, abyśmy nie wykonywali pełnoekranowej, wyraźnej operacji na początku każdej klatki. Jednak robimy to z glClear.obciążenie bufora logicznego - wolne obciążenie bufora ramki - 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]; 

Nie są rzeczywiście stosując bufor głębokości lub wzornika.

Dzieje się tak, gdy renderujemy teksturę jako kafelki i dzieje się to za każdym razem, gdy ładujemy nowy kafelek. Wskazuje na nasze polecenie glDrawArrays.

Wszelkie zalecenia dotyczące sposobu pozbycia się tego ostrzeżenia?

Jeśli to pomaga w ogóle, jest to, jak jesteśmy utworzenia warstwy:

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

Należy zauważyć, że podczas gdy punkty analizator to uwagę jako punkt optymalizacji, z mojego doświadczenia to było dość nieznaczna. Szanse są, to ma niewiele wspólnego z tym, dlaczego aplikacja renderuje powoli. Spójrz na instrument OpenGL ES Driver i sprawdź, czy maksymalizujesz renderera (fragment ograniczony) lub kaflarza (geometria ograniczona). –

+0

Uruchomiliśmy instrumentację OpenGL ES i wydaje się, że maksymalizujemy współczynnik wypełnienia (fragmenty). Później renderujemy tylko 256x256 płytek wypełniających widoczny obszar. Czy są jakieś specyficzne dla Apple rozszerzenia, na które być może powinniśmy zwrócić uwagę, niezależnie od tego, czy tworzy to tekstury, czy sposób, w jaki konfigurujemy tekstury, czy w jakimkolwiek innym celu? – user1687195

+1

Jako aktualizację, ustawiamy glHint (GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FASTEST); I wydaje się, że pomogło to trochę z FPS. – user1687195

Odpowiedz

0

Po dużo pracy i rozwagą, udało mi się rysunek to w końcu.

Ok Używam biblioteki Open Source o nazwie GLESuperman. Jest to świetna biblioteka, która pomaga w debugowaniu tego rodzaju problemów i może być używana do rysowania grafiki - jest dość szybka. Tak, nie mam pojęcia, dlaczego tak się nazywa ... Ale jest za darmo i działa. Po prostu wyszukaj go na Github. Jest bardzo często aktualizowany i obsługuje system iOS 7 lub nowszy.

Ok, więc do jego realizacji, należy wykonać następujące czynności:

// 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]; 
Powiązane problemy