2010-12-29 2 views
6

W mojej aplikacji opartej na OpenGL-ES 1.1, używam CALayer s jako źródła dla tekstur OpenGL. Te CALayer s zawierają CGImage s oraz tekst renderowany przez CoreGraphics. Innym źródłem tekstury OpenGL jest zrzut ekranu z UIView pobranego przy użyciu -[CALAyer renderInContext:] i UIGraphicsGetImageFromCurrentImageContext. Obecnie uruchamiam całkowicie główny wątek.Które części UIKit, Core Graphics, Core Animation, OpenGL są dozwolone na innych niż główny wątek?

Ten ostatni przypadek jest szczególnie zły, ponieważ zatrzymuje renderowanie OpenGL przez cały czas tworzenia UIView i jego zrzut ekranu.

Teraz rozważam przeniesienie kodu OpenGL do osobnego wątku z nadzieją obejścia tego blokowania. Najlepiej byłoby, gdyby zrzut ekranu został wykonany na innym wątku (w razie potrzeby głównym wątku) niż renderowanie OpenGL.

Nie udało mi się znaleźć pełnego zakresu dokumentacji wymagającej uruchomienia głównego wątku, a co nie. Znalazłem kilka komentarzy w iOS 4 release notes, a niektóre komentarze w konkretnych metodach UIKit, ale brakuje mi pełnego obrazu.

Kod działa w systemie iOS 4.x lub nowszym.

Odpowiedz

3

Możesz zrobić rysunek z OpenGL ES na wątku tła, o ile nie masz nie próbuj uzyskać dostępu do kontekstu OpenGL z innego wątku w tym samym czasie. Więcej informacji na ten temat można znaleźć w Apple's Technical Q&A QA1612.

Mam wiele problemów z aktualizowaniem treści CALayer z wątku w tle, więc wykonuję każdą pracę z warstwami na głównym wątku. Core Animation odpala swoje animacje na wątku tła.

Nigdy nie aktualizowałem niczego związanego z UIKit z wątku w tle, ale niektóre aspekty rysowania w UIKit zostały wykonane w bezpieczny dla wątków w wersji 4.0. David Duncan komentuje here, że rysunek do kontekstu jest teraz bezpieczny dla wątków.

W twoim przypadku nie widzę problemu z uruchomieniem renderowania OpenGL ES w wątku tła (być może przy użyciu kolejki szeregowej w GCD, aby uniemożliwić dostęp do kontekstu z wielu wątków naraz), a następnie wykonać obraz chwyta inny.

2

Animacja rdzenia jest ogólnie bezpieczna dla wątków, ale UIKit i OpenGL ES (przynajmniej na iOS) nie są wątkowo bezpieczne. UIKit może być używany tylko w głównym wątku, a OpenGL ES musi być konsekwentnie używany w jednym wątku (zwykle główny wątek).

+0

Czy uważasz, że to działałoby, aby przenieść OpenGL do wątku tła i zachować resztę w głównym wątku? A co z kodem Core Graphics, który generuje niektóre tekstury? Czy mogę przenieść to również do wątku OpenGL? –

+0

Pure Core Graphics/Quartz może być używany w wątku roboczym, ale nie zawsze może bezpiecznie przekroczyć granice nici. Wszystko, co używa UIKit (takie jak funkcje 'UIGraphics ...') musi nadal działać w głównym wątku. –

+0

OpenGL jest bezpieczny dla wątków, po prostu nie można używać tego samego kontekstu w wielu wątkach ani udostępniać zasobów między różnymi kontekstami, chyba że znajdują się one w grupie share. Sprawdź dokumentację dla EAGLSharegroup (http://developer.apple.com/library/ios/documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/). – Tommy