Какие части UIKit, Core Graphics, Core Animation, OpenGL разрешены для не основного потока? - PullRequest
6 голосов
/ 29 декабря 2010

В моем приложении на основе OpenGL-ES 1.1 я использую CALayer s в качестве источника для текстур OpenGL.Эти CALayer s включают CGImage s и текст, отрисованный с помощью CoreGraphics.Другой источник текстур OpenGL - скриншот UIView, сделанный с использованием -[CALAyer renderInContext:] и UIGraphicsGetImageFromCurrentImageContext.В настоящее время я полностью работаю в основном потоке.

Последний случай, в частности, довольно плох, поскольку он останавливает рендеринг OpenGL на все время, необходимое для создания UIView и его скриншота.

Теперь я собираюсь переместить код OpenGL в отдельный поток, надеясь обойти эту блокировку.В идеале снимок экрана должен быть сделан в другом потоке (основной поток, если необходимо), чем рендеринг OpenGL.

Я не смог найти полное описание в документации о том, что требуется для запуска в основном потоке, ичто нет.Я нашел некоторые комментарии в примечаниях к выпуску iOS 4 и некоторые комментарии в определенных методах UIKit, но мне не хватает полной картины.

Код работает на iOS 4.x или выше.

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Вы можете рисовать с помощью OpenGL ES в фоновом потоке, если вы не пытаетесь одновременно получить доступ к контексту OpenGL из другого потока.См. Технические вопросы и ответы QA1612 от Apple.

Я столкнулся с рядом проблем при обновлении содержимого CALayer из фонового потока, поэтому я выполняю любую работу со слоями наОсновная тема.В любом случае Core Animation запускает свои анимации в фоновом потоке.

Я никогда не обновлял что-либо, связанное с UIKit, из фонового потока, но некоторые аспекты рисования в UIKit были сделаны поточно-безопасными в 4.0.Дэвид Дункан комментирует здесь , что рисование в контексте теперь потокобезопасно.

В вашем случае я не вижу проблем с запуском рендеринга OpenGL ES в фоновом потоке (возможно, споследовательная очередь отправки в GCD для предотвращения доступа к контексту из нескольких потоков одновременно), а затем выполнение изображения захватывает другой.

2 голосов
/ 29 декабря 2010

Core Animation, как правило, является поточно-ориентированной, но UIKit и OpenGL ES (по крайней мере, на iOS) не являются поточно-ориентированными. UIKit должен использоваться только в основном потоке, а OpenGL ES должен последовательно использоваться в одном потоке (обычно в основном потоке.)

...