我想在并发的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呈现的最佳实践是什么?
发布于 2013-12-18 20:40:39
这不仅是好的,这也是唯一的方式,您可以在多个线程之间共享OpenGL资源。请注意,共享资源通常仅限于分配内存的资源(例如缓冲区对象、纹理、着色器)。它们不包括仅存储状态的对象(例如全局状态机、Framebuffer对象或顶点数组对象)。但是如果您正在考虑修改用于呈现的数据,我强烈建议您不要这样做。
每当GL在管道中有一个尚未完成的命令时,任何修改该命令使用的资源的尝试都会阻塞,直到命令完成为止。一个更好的解决方案将是双缓冲您的资源,有一个副本,您使用的呈现和单独的副本,您使用的更新。完成更新后,下次绘图线程使用该资源时,让它交换用于更新和绘图的缓冲区。这将减少驱动程序将工作线程与绘图线程同步的时间。
现在,如果您在这里建议您要从多个线程中提取,那么您应该重新考虑您的策略。OpenGL通常不会受益于从多个线程发出的绘制命令,它只是创建了一个同步噩梦。多线程主要用于控制多个窗口上的VSYNC (可能不会在ES中遇到)或后台的流资源数据。
https://stackoverflow.com/questions/20665346
复制相似问题