1

我想在后台线程上完成所有渲染。目前,我在 iOS 上使用CAEAGLLayerUIView 子类中的 a,然后在后台线程上执行所有 OpenGL 启动(包括通过...绑定层:

[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];

...)但是,当我在 Android 上尝试此操作时,Apporable 兼容层会在 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 线程上进行渲染?是否有任何适用的线程文档(例如,是用于运行 iOS 主线程的 Android UI 线程?还是一个单独的线程?)

4

1 回答 1

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

  2. 通过主上下文中的 sharegroup 值创建EAGLContext用于后台线程的 shared s

  3. 使这些共享上下文在后台线程上处于当前状态

  4. 在使用 libdispatch 和上下文时要非常小心(理想情况下,您应该使用 NSThread 方法在主线程上运行东西)具体来说,请注意为dispatch_sync.

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

更多在合适的讨论组

于 2013-09-24T20:50:50.677 回答