2014-07-08 13 views
8

Wydaje mi się, że system przyjmuje inny zrzut ekranu niż ten, który moja aplikacja przyjmuje na applicationWillResignActive.Wielozadaniowość systemu iOS obraz kontra rozrzucenie obrazu aplikacji rozbieżność obejścia

Ku mojemu zaskoczeniu jest opóźnienie około 0,6 sekundy między obrazem podjętych przez system (b) a obraz podjęte przez grę (D). To sprawia, że ​​system musi przechwycić ekran przed applicationWillResignActive, ale w przypadku gry z szybko poruszającymi się obiektami może to być łatwo zauważone przez gracza.

Jak mogę to obejść?

są następujące kroki gracz czyni i jak to powoduje taką różnicę:

enter image description here

(a) Gracz pulsuje przycisk home, kiedy jest odtwarzany. (b) Wykonano zrzut ekranu systemu. (c) Odtwarzacz dotyka ikony gry. (d) Gra jest uruchamiana z przechwytywaniem ekranu wykonanym na applicationWillResignActive. (e) Gra jest wstrzymana, pokazując rozbieżności w szybko poruszającym się obiekcie.

+1

Kiedy przerwałeś swoją grę? Możesz umieścić punkt przerwania na '_saveSnapshotWithName:' ​​i zobaczyć, kiedy zostanie wywołany. –

+0

@LeoNatan Gra została wstrzymana na applicationWillResignActive, chociaż zrzut ekranu jest wykonywany w applicationDidEnterBackground, testowałem wykonanie zrzutu ekranu na aplikacjiWillResignActive, ale wynik jest taki sam – rraallvv

+0

Jeśli gra została zatrzymana w 'applicationWillResignActive', to zrzut ekranu wykonany w' applicationDidEnterBackground 'powinno być dokładne. Być może twój problem jest po powrocie. –

Odpowiedz

0

Uważam, że dzieje się tak dlatego, że renderowanie gier nie znajduje się w głównym wątku (na pewno nie powinno być w głównym wątku), więc po zwróceniu applicationDidEnterBackground/applicationWillResignActive system wykonuje natychmiast zrzut ekranu z bufora karty graficznej.

W tej chwili wątek pętli gry jest nadal uruchomiony, więc może zaktualizować niektóre klatki przed wstrzymaniem.

nie wiem jak zaimplementować swoją pętlę gry, ale można spróbować to:

W applicationDidEnterBackground/applicationWillResignActive, umieścić globalną semafora (dispatch_semaphore_t) i zablokować główny wątek, w pętli gry, obserwować semafora a jeśli istnieje, wstrzymaj pętlę gry, a następnie zasygnalizuj semafor.

To zapewni, że zrzut ekranu zostanie zrobiony po wstrzymaniu gry.

Należy również zauważyć, że po applicationWillResignActive system wykona migawkę przełącznika zadań, a po applicationDidEnterBackground system wykona migawkę, gdy następnym razem aplikacja wejdzie na pierwszy plan.

Mam nadzieję, że to ci pomoże.

Powiązane problemy