GLKViewControllerDelegate wird blockiert

8

Ich habe einen GLKViewController, um einige OpenGL-Zeichnungen zu bearbeiten. Ich habe die Methode glkView:drawInRect und update implementiert und die Eigenschaft preferredFramesPerSecond auf 30 (den Standardwert) gesetzt.

Das Problem besteht darin, dass die Delegate-Methoden nicht mehr ausgelöst werden, wenn der Benutzer mit anderen Teilen der App interagiert. Die zwei Fälle, in denen ich das gesehen habe, sind, wenn der Benutzer einen UITableView scrollt oder mit einem MKMapView interagiert.

Gibt es eine Möglichkeit, sicherzustellen, dass diese Delegierten immer auslösen, unabhängig davon, was der Rest der App tut. Das einzige Mal, wenn ich möchte, dass dies aufhört, ist, wenn die App in den Hintergrund tritt (was automatisch der Fall ist).

    
Ross Kimes 09.04.2012, 22:59
quelle

1 Antwort

15

Der Grund dafür ist, dass beim Scrollen in einer Tabellenansicht oder einer Kartenansicht der Runloop in UITrackingRunLoopMode ist, was eine höhere Priorität als der Standardmodus hat. Dies verhindert, dass einige Ereignisse ausgelöst werden, um eine hohe Scrollleistung zu garantieren.

Um Ihr Problem zu lösen, müssen Sie eine eigene Rendering-Schleife einrichten, anstatt sich auf GLKViewController zu verlassen.

  • Zuerst enableSetNeedsDisplay von GLKView auf NO setzen (sollte bei Verwendung von GLKViewController automatisch gesetzt werden).
  • Setzen Sie preferredFramesPerSecond auf 0 (oder vielleicht 1), um die Rendering-Schleife von GLKViewController zu deaktivieren oder verwenden Sie GLKViewController überhaupt nicht
  • Importieren Sie das QuartzCore-Framework: #import <QuartzCore/QuartzCore.h>
  • Erstelle ein CADisplayLink und plane es in NSRunLoopCommonModes :
%Vor%
  • optional: Setzen Sie frameInterval von displayLink auf 2 (= halbe Framerate)
  • die Rendermethode:
%Vor%

Ich habe das nicht getestet, also sag mir, ob es funktioniert!

    
Felix 07.07.2012, 21:52
quelle

Tags und Links