Warum funktioniert mein OpenGL ES iPhone Spiel flackern, wenn ich das Telefon einschalten zuerst?

StackOverflow https://stackoverflow.com/questions/210225

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe ein einfaches Spiel für das iPhone mit OpenGL ES. Alles funktioniert gut, außer für dieses Problem:

Ich schalte das Telefon vollständig aus und dann wieder an, starten Sie dann meine app und ich bekomme diese wierd Flackern! Jeder zweite Rahmen ist richtig ... die falschen Frames sind genau die gleichen Rahmen immer und immer wieder. Wenn ich die App beenden, starten Sie es wieder alles in Ordnung ist. Wenn ich beenden und neu starten 10-mal in Folge alles ist jedes Mal gut.

Aber wenn ich das Telefon ausschalten, dann wieder ein, dann starten Sie die App bekomme ich die gleiche Flackern ich das erste Mal die App starten.

Warum ist das passiert?!

Hat jemand anderes hatte dieses Problem?

Cheers!

War es hilfreich?

Lösung

Apple-veröffentlichte weitere Informationen zu diesem Problem:

  

F: Mein OpenGL ES Anwendung flimmert.   Vor allem, wenn auf dem iPhone 3GS läuft,   das Flimmern scheint jeder passieren   Rahmen. Wie behebe ich dieses Problem?

     

A: Standardmäßig wird der Inhalt eines   renderbuffer werden, nachdem sie für ungültig erklärt   wird auf dem Bildschirm dargestellt (durch den Aufruf   -EAGLContext / presentRenderbuffer :). Ihre Anwendung muss vollständig   neu zeichnen den Inhalt der   renderbuffer Sie jedes Mal ein Unentschieden   Rahmen, sonst können Sie beobachten   Flimmern oder andere unerwartete   Ergebnisse.

     

Sie müssen eine Farbe zu jedem bieten   Pixel auf dem Bildschirm. Am Anfang   Ihrer Zeichnung Code ist es eine gute   Idee zu verwenden glClear () zu initialisieren   die Farbpuffer. Ein Vollbild klar   jeder Ihrer Farbe, Tiefe und   Stencilbuffer (wenn Sie sie verwenden)   auch zu Beginn eines Rahmens kann   im Allgemeinen Ihrer Anwendung verbessern   Leistung.

     

Wenn Ihre Anwendung zu erhalten   der drawable Inhalt zwischen Frames,   Sie können die Option hinzufügen   kEAGLDrawablePropertyRetainedBacking =   JA zu Ihrem CAEAGLLayer Objekt   drawableProperties Eigenschaft. Mit   Diese Option erfordert zusätzliche Speicher   und können Ihre Anwendung reduzieren   Leistung.

Andere Tipps

Hmm. Ich habe nicht viel mit OpenGL auf dem iPhone gemacht, aber ich muß sagen, dass ich dieses Verhalten nicht mit anderen Anwendungen bemerkt habe. Ich würde vermuten, dass es etwas zu tun, wie Sie Schalt aktiven Framebuffer.

Vielleicht auf einige der Beispielcode einen Blick darauf werfen, und sehen Sie, was Sie anders machen?

Ich glaube, das Problem hat mit einer Korruption im Eckpunktpufferspeicher zu tun, das auftritt, wenn das iPhone O Steuerung der Anwendung nimmt (Schloss und Fortsetzen oder Warnung Popup). Ich habe auch dieses Problem, aber noch keine geeigneten fix gefunden, so scheint es, ein oder mehr Objekte in der Szene zu sein. Wir verwenden eine Texturatlas und keiner der anderen Objekte, die die Textur teilen scheinen betroffen zu sein. Vielleicht zerstören und Ihre Vertexpuffer neu zu erstellen wird das Problem beheben.

Ist es möglich, die Sie anrufen glRenderBuffer () und Senden der presentRenderBuffer Nachricht an Ihre EAGLContext ohne OpenGL-Updates getan zu haben, das heißt, keine neuen glDrawElements oder glDrawArrays. Wenn Sie dies tun, ohne kEAGLDrawablePropertyRetainedBacking auf YES gesetzt, dann kann man ein störendes Flimmern bekommen.

Schauen Sie eine der kEAGLDrawablePropertyRetainedBacking auf CAEAGLLayer der drawableProperties Eigenschaft. Diese Eigenschaft bestimmt das Verhalten der ziehbar Oberfläche, nachdem sie ihren Inhalt angezeigt haben. Wenn diese Eigenschaft auf NO gesetzt ist, dann werden die Inhalte nicht beibehalten und daher nicht garantiert nach der Anzeige unverändert bleiben. Wenn Sie es auf YES gesetzt, dann wird der Inhalt bleibt bestehen und wird nach der Anzeige unverändert bleiben.

I kEAGLDrawablePropertyRetainedBacking auf YES glaube Einstellung wird das Problem verschleiern, aber nicht beheben.

Ich hatte das gleiche Problem mit dem Blinken / Flackern Wechsel zwischen dem aktuellen Bild und einem festen Bild ... es auf einem 3GS passieren würde, aber kein 3G, erste Generation, oder den Simulator.

In meinem Fall war das Problem verursacht, wenn ich den Kontext, in ESRenderer einrichten würde, aber nicht wirklich etwas ziehen, das heißt in dem folgenden Code [Szene Unentschieden] haben zog nichts in bestimmten Staaten. Auf den älteren iPhones und dem Sim, wenn Sie etwas zeichnen, nicht, es schien nicht die OpenGL Puffer zu drehen ... aber auf dem 3GS es tut. Wie auch immer, war meine Abhilfe Animation in diesen Staaten zu stoppen (das heißt den Timer stoppen, der die Auslosung rountine nennt), wenn ich nichts Zeichnung wurde.

- (void) draw
{
   [EAGLContext setCurrentContext:context]; 
   glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
   glViewport(0, 0, backingWidth, backingHeight);

   //Render the GLScene...
   [scene draw];

   glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
   [context presentRenderbuffer:GL_RENDERBUFFER_OES];   
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top