2013-02-25 8 views
10

Tworzymy grę z elementami 2d wyświetlanymi z UIViews nad widokiem OpenGL ES (w szczególności używamy GLKit's GLKView) i mamy problemy z utrzymaniem optymalnej synchronizacji pozycji.Synchronizuj układ UIView z ramkami OpenGL

W widoku nadrzędnym layoutSubviews, wyświetlamy na ekranie pozycje 3d na świecie i wykorzystujemy je jako lokalizacje dla kilku "markerów" w grze w postaci UIView. Cała gra aktualizuje się tylko w odpowiedzi na poruszenie kamery przez użytkownika, a kamera wyświetla widok za każdym razem, gdy się porusza.

Wszystko działa dobrze, z tym że znaczniki wydają się z grubsza 1 klatką zsynchronizowane z renderowaniem 3d. Mówię szorstko, ponieważ (1) jest to oszacowanie! i (2) Zastanawiam się, czy istnieje potencjalnie problem z wielowątkowością: czy synchronizacja ze specjalnym odświeżaniem oddzwaniania nie jest zsynchronizowana ze specjalnym ekranem?

Czy istnieje sposób podpięcia układu widoku? Podpowiedzi tak, aby był on zsynchronizowany z aktualizacją widoku 3D?

Aktualizacja: Niesamowicie, nazywając layoutIfNeeded natychmiast po setNeedsLayout sprawia problemu gorzej! Prawdopodobnie 2 lub więcej klatek na zewnątrz. Naprawdę tego nie rozumiem!

Odpowiedz

0

Co wywołuje Twoje połączenie z LayoutSubviews?

Wszystko zależy od tego, w którym miejscu RunLoop wywoływane jest połączenie, a gdzie wywoływane jest wywołanie aktualizacji GLK.

Ogólnie rzecz biorąc, dla tego, co robimy, chciałbym zrobić twój układ jako efekt uboczny aktualizacji GLK - tj. Nie czekać na zmiany layoutSubviews, aby zmienić swoją pozycję.

(jeśli korzystasz z OpenGL, cały system "layout" nie jest ci zbyt przydatny: GLK działa w swoim własnym małym świecie ze zmienną liczbą klatek i chcesz, żeby to był twój punkt odniesienia)

0

Nie można tego zrobić poprawnie bez rysowania klatek filmu za pomocą OpenGL (rysowanie w tym samym kontekście, aby zawsze mieć pewność, że jedna klatka zawiera ten sam czas wideo i animacji). Wszystko, co robisz, kompensacja framerate, przewidywanie opóźnienia, zależy tylko od przypadku i zawsze będzie trochę niezsynchronizowane.

Nie jestem zaznajomiony z UIView, ale jeśli jest jakiś sposób, aby pozwolić mu odtwarzać dźwięk i kopiować klatki do tekstury, zrób to. Opóźnienie w dźwięku jest znacznie łatwiejsze do zrekompensowania i znacznie mniej zauważalne przez ludzi niż w wideo.

Powiązane problemy