Какие части UIKit, Core Graphics, Core Animation, OpenGL разрешены для не основного потока?
в моем приложении на основе 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 ответов
вы можете рисовать с помощью 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 должен последовательно использоваться в одном потоке (обычно в основном потоке.)