Apportable — как запустить OpenGL в фоновом потоке?

Я хотел бы сделать весь свой рендеринг в фоновом потоке. В настоящее время я работаю над iOS, используя CAEAGLLayer в подклассе UIView, а затем выполняю все раскрутки OpenGL в фоновом потоке (включая привязку слоя через...:

[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];

...) Однако, когда я пробую это на Android, уровень совместимости Apportable вызывает ошибки в EGL, потому что он пытается использовать поверхность EGL из другого потока...:

09-24 12:25:04.667    2622-2661/com.apportable.Spin E/EglHelper﹕ eglSwapBuffers returned 12301. tid=1535
09-24 12:25:04.677    2622-2661/com.apportable.Spin W/Adreno200-EGL﹕ <qeglDrvAPI_eglSwapBuffers:3415>: EGL_BAD_SURFACE

Как я могу выполнить рендеринг в потоке BG? Существует ли какая-либо документация по Apportable потокам (например, используется ли поток пользовательского интерфейса Android для запуска основного потока iOS? Или это отдельный поток?)


person nmr    schedule 24.09.2013    source источник


Ответы (1)


  1. Создайте представление с помощью CAEAGLLayer и создайте EAGLContext в основном потоке.

  2. Создайте общие EAGLContext для использования в фоновых потоках через значения общих групп из основного контекста.

  3. Сделайте эти общие контексты текущими в фоновых потоках.

  4. Будьте ОЧЕНЬ осторожны при использовании libdispatch и контекстов (в идеале вы должны использовать методы NSThread для запуска вещей в основном потоке). В частности, остерегайтесь оптимизации, задокументированной для dispatch_sync.

Модель многопоточности Apportable немного нестандартна по сравнению с обычной моделью Android. В основном это связано с тем, что iOS запускает OpenGL в своем основном потоке. Поток, в котором запускается ваше приложение, — это тот же поток, в котором создается начальная поверхность OpenGL. Интересным следствием этого является то, что наши представления на базе Android также создаются и управляются в потоке GL (с помощью некоторых умных манипуляций с конструкциями Looper/MessageQueue и Dialog). Пока первый контекст OpenGL, на который вы ссылаетесь в Objective-C, находится в основном потоке; большинство вещей для общих контекстов должны работать должным образом. Однако, если это не так, все может очень быстро измениться. В идеале вы должны создать общие контексты для переключения на фоновые потоки на основе основного контекста, созданного из основного потока.

Подробнее читайте в группе обсуждения Apportable.

person Paul Beusterien    schedule 24.09.2013