我想在并发 GCD 队列中的 OpenGL ES 项目中做一些工作。是否可以为每个线程创建 EAGLContext?我打算这样做:
queue_ = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue_, ^{
NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary];
EAGLContext* context = threadDictionary[@"context"];
if (!context) {
context = /* creating EAGLContext with sharegroup */;
threadDictionary[@"context"] = context;
}
if ([EAGLContext setCurrentContext:context]) {
// rendering
[EAGLContext setCurrentContext:nil];
}
});
如果不正确,并行化 OpenGL 渲染的最佳做法是什么?
Best Answer-推荐答案 strong>
这不仅没问题,而且这是您可以在多个线程之间共享 OpenGL 资源的唯一方式。请注意,可共享资源通常仅限于分配内存的资源(例如缓冲区对象、纹理、着色器)。它们不包括仅存储状态的对象(例如全局状态机、帧缓冲区对象或顶点数组对象)。但是,如果您正在考虑修改用于渲染的数据,我强烈建议您不要这样做。
只要 GL 在管道中有一个尚未完成的命令,任何修改该命令使用的资源的尝试都会阻塞,直到命令完成。更好的解决方案是双缓冲您的资源,拥有一个用于渲染的副本和一个用于更新的单独副本。完成更新后,下次绘图线程使用该资源时,让它交换用于更新和绘图的缓冲区。这将减少驱动程序必须将您的工作线程与绘图线程同步的时间。
现在,如果您在这里建议您要从多个线程中提取,那么您应该重新考虑您的策略。 OpenGL 通常不会从多个线程发出绘图命令中受益,它只会造成同步噩梦。多线程主要用于控制多个窗口上的 VSYNC(在 ES 中可能不会遇到)或在后台流式传输资源数据。
关于ios - 可以为每个线程创建 EAGLContext 吗?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/20665346/
|