Was ist eine bessere Möglichkeit, eine Spielschleife auf dem iPhone als NSTimer zu erstellen?

Ich programmiere ein Spiel auf dem iPhone. Ich benutze gerade NSTimer, um mein Spielupdate/Render auszulösen. Das Problem damit ist, dass ich (nach dem Profiling) zwischen den Aktualisierungen/Rendern viel Zeit verliere und dies scheint hauptsächlich mit dem Zeitintervall zu tun zu haben, das ich an NSTimer anschließe.

Also meine Frage ist, was ist die beste Alternative zur Verwendung von NSTimer?

Eine Alternative pro Antwort bitte.

0
hinzugefügt bearbeitet
Ansichten: 2
Ich habe mir viele Beispiele und recherchierte Alternativen im Internet angeschaut. So kenne ich schon einige Alternativen. Was ich wirklich will ist, was andere Leute denken, dass die beste Alternative ist? Ich arbeite an einem extrem kurzen Projekt, so dass jede Zeit, die bei der Untersuchung eingespart wird, eine große Hilfe sein wird.
hinzugefügt der Autor Ashley Davis, Quelle
Hast du dir die iPhone-Entwicklerbeispiele angesehen? Ich denke, es gibt einige Beispiele (z. B. Touch Fighter oder CrashLanding), die aufschlussreich sein könnten.
hinzugefügt der Autor Mark Bessey, Quelle

3 Antworten

Sie können eine bessere Leistung mit Threads erzielen, versuchen Sie Folgendes:

- (void) gameLoop
{
    while (running)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self renderFrame];
        [pool release];
    }
}

- (void) startLoop
{
    running = YES;
#ifdef THREADED_ANIMATION
    [NSThread detachNewThreadSelector:@selector(gameLoop)
    toTarget:self withObject:nil];
#else
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES];
#endif
}

- (void) stopLoop
{
    [timer invalidate];
    running = NO;
}

In der renderFrame -Methode Sie bereiten den Framebuffer vor, zeichnen einen Frame und präsentieren den Framebuffer auf dem Bildschirm. (P. S. Es gibt einen großartigen Artikel zu verschiedenen Arten von Spielschleifen und ihren Vor- und Nachteilen.)

0
hinzugefügt
@Zoul: funktioniert die THREADED_ANIMATION Alternative auch für frühere Versionen? Ich dachte, ich hätte es irgendwo gelesen.
hinzugefügt der Autor Jonas Byström, Quelle
@tc: Du hast recht, aber das Poster sagt nichts über die verwendete Grafikebene aus. Da wir über Spiele reden, habe ich OpenGL angenommen, wo eine solche Schleife ohne Probleme funktioniert.
hinzugefügt der Autor zoul, Quelle
Du meinst frühere iOS-Versionen? Ja, ich habe ähnlichen Code in Spielen um 2.x oder 3.x verwendet.
hinzugefügt der Autor zoul, Quelle
-1. UIView ist nicht threadsicher, Sie müssen also eine ganze Menge anderer Dinge tun, damit es funktioniert. UIGraphics ist seit 4.0 nur Thread-sicher.
hinzugefügt der Autor tc., Quelle

Ich weiß nicht besonders über das iPhone, aber vielleicht kann ich noch helfen: Anstatt einfach eine feste Verzögerung am Ende der Schleife einzustecken, verwenden Sie Folgendes:

  • Bestimmen Sie ein Aktualisierungsintervall, mit dem Sie zufrieden wären und das größer ist als ein einzelner Durchlauf durch Ihre Hauptschleife.
  • Nehmen Sie zu Beginn der Schleife einen aktuellen Zeitstempel der verfügbaren Auflösung und speichern Sie sie.
  • Nehmen Sie am Ende der Schleife einen anderen Zeitstempel und bestimmen Sie die verstrichene Zeit seit dem letzten Zeitstempel (initialisieren Sie dies vor der Schleife).
  • Sleep/Delay für den Unterschied zwischen Ihrer idealen Frame-Zeit und der bereits verstrichenen Zeit für den Frame.
  • Beim nächsten Frame können Sie sogar versuchen, Ungenauigkeiten im Schlafintervall auszugleichen, indem Sie mit dem Zeitstempel am Anfang der vorherigen Schleife vergleichen. Speichere die Differenz und addiere/subtrahiere sie vom Schlafintervall am Ende dieser Schleife (Schlaf/Verzögerung kann zu lang oder zu kurz gehen).

Vielleicht möchten Sie einen Warnmechanismus haben, mit dem Sie wissen, ob das Timing zu eng ist (dh wenn Ihre Ruhezeit nach dem Ausgleich weniger als 0 ist, was bedeutet, dass Sie mehr Zeit für die Verarbeitung benötigen als Ihre Bildrate erlaubt). Der Effekt wird sein, dass dein Spiel langsamer wird. Für zusätzliche Punkte empfiehlt es sich, das Rendering für einige Zeit zu vereinfachen, wenn Sie dies feststellen, bis Sie wieder genügend freie Kapazität haben.

0
hinzugefügt

Mit dem CADisplayLink können Sie herausfinden, wie im OpenGL ES Template-Projekt in XCODE ein Projekt ausgehend von dieser Vorlage erstellt wird und der EAGLView-Klasse einen Blick zuweist. Dieses Beispiel basiert auf einem offenen GL, aber Sie können CADisplayLink nur für andere verwenden Art von Spielen

0
hinzugefügt