Apportable - 如何在后台线程上运行OpenGL?

时间:2013-09-24 19:28:45

标签: egl apportable

我想在后台线程上完成所有渲染。目前,我在UIView子类中使用CAEAGLLayer在iOS上工作,然后在后台线程上执行所有OpenGL旋转(包括通过...绑定图层:

[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];

...)但是,当我在Android上尝试这个时,Apportable兼容层会触发EGL中的错误,因为它试图从另一个线程使用EGL Surface ......:

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线程文档(例如用于运行iOS主线程的Android UI线程?还是一个单独的线程?)

1 个答案:

答案 0 :(得分:2)

  1. 使用CAEAGLLayer创建视图并在主线程上创建EAGLContext

  2. 通过创建用于后台线程的共享EAGLContext 来自主要背景的共享组值

  3. 在背景线程上使这些共享上下文最新

  4. 使用libdispatch和contexts非常小心(理想情况下是你 应该使用NSThread方法在main上运行东西 线程)具体而言,请注意为dispatch_sync记录的优化。

  5. 与普通Android线程模型相比,Apportable线程模型有点不标准。这主要是因为iOS在其主线程中运行OpenGL。启动应用程序的线程与创建初始OpenGL表面的线程相同。对此有趣的分支是我们的基于Android的视图也在GL线程中创建和管理(通过对Looper / MessageQueue和Dialog构造的一些巧妙操作)。只要您在Objective-C中引用的第一个OpenGL上下文位于主线程上;共享上下文的大部分内容应该按预期工作。但是,如果不是这种情况,事情可能会很快下降。理想情况下,您应该根据从主线程创建的主要上下文创建共享上下文以交换到后台线程。

    更多the Apportable discussion group