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.
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? –
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. –
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