2014-07-08 22 views
8

Es scheint mir, dass das System eine andere Bildschirmaufnahme nimmt, die meine App auf applicationWillResignActive nimmt.iOS Multitasking Switcher-System Bild vs Anwendung Bild Diskrepanz Workaround

Zu meiner Überraschung gibt es eine Verzögerung von etwa 0,6 Sekunde zwischen dem Bild von dem System genommen (b) und das durch das Spiel (d) aufgenommene Bild. Es macht Sinn, wenn das System die Bildschirmaufnahme vor applicationWillResignActive machen muss, aber für ein Spiel mit sich schnell bewegenden Objekten kann dies leicht vom Spieler bemerkt werden.

Wie kann ich dies umgehen?

Nachfolgend sind die Schritte der Spieler macht und wie sie verursacht eine solche Diskrepanz:

enter image description here

(a) Der Spieler pulst die Home-Taste, wenn sie spielt. (b) Die Bildschirmaufnahme des Systems wird erstellt. (c) Der Spieler tippt auf das Spielsymbol. (d) Das Spiel wird mit der Bildschirmaufnahme unter applicationWillResignActive gestartet. (e) Das Spiel wird angehalten und zeigt die Diskrepanz in einem sich schnell bewegenden Objekt.

+1

Wann hast du dein Spiel pausiert? Sie können einen Breakpoint auf '_saveSnapshotWithName:' ​​setzen und sehen, wann er aufgerufen wird. –

+0

@LeoNatan Das Spiel ist auf applicationWillResignActive pausiert, obwohl der Screenshot in applicationDidEnterBackground aufgenommen wurde, habe ich den Screenshot auf applicationWillResignAktiv gemacht, aber das Ergebnis ist das gleiche – rraallvv

+0

Wenn das Spiel in 'applicationWillResignActive' angehalten wird, dann der Screenshot in' applicationDidEnterBackground 'sollte genau sein. Vielleicht ist dein Problem bei der Rückkehr. –

Antwort

0

Ich glaube, das ist, weil Ihr Spiel Rendering nicht auf Haupt-Thread (sicherlich sollte es nicht auf Haupt-Thread sein), so wenn applicationDidEnterBackground/applicationWillResignActive zurückgegeben wird, nimmt das System einen Screenshot aus Grafikkarte Puffer sofort.

Derzeit läuft Ihr Game-Loop-Thread noch, daher können einige Frames aktualisiert werden, bevor sie pausiert werden.

Ich weiß nicht, wie Sie Ihr Spiel Schleife implementieren, aber man kann versuchen, diese:

In applicationDidEnterBackground/applicationWillResignActive, eine globale Semaphore gesetzt (dispatch_semaphore_t) und blockiert den Haupt-Thread, in Ihrem Spiel Schleife, beobachtet die Semaphore und wenn es existiert, pausiere deine Spielschleife und signalisiere dann den Semaphor.

Dies stellt sicher, dass der Screenshot aufgenommen wird, nachdem das Spiel angehalten wurde.

Beachten Sie auch, dass nach applicationWillResignActive das System den Snapshot für den Task-Switcher erstellt und nach das System einen Snapshot für das nächste Mal erstellt, wenn Sie den Vordergrund aufrufen.

Hoffe, das wird Ihnen helfen.