Какие части UIKit, Core Graphics, Core Animation, OpenGL разрешены для не основного потока?

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

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

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

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

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

2 ответов


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

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

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

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


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