首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以为每个线程创建EAGLContext吗?

可以为每个线程创建EAGLContext吗?
EN

Stack Overflow用户
提问于 2013-12-18 18:08:46
回答 1查看 1K关注 0票数 2

我想在并发的GCD队列中在我的OpenGL ES项目中做一些工作。是否可以为每个线程创建EAGLContext?我要这样做:

代码语言:javascript
复制
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呈现的最佳实践是什么?

EN

回答 1

Stack Overflow用户

发布于 2013-12-18 20:40:39

这不仅是好的,这也是唯一的方式,您可以在多个线程之间共享OpenGL资源。请注意,共享资源通常仅限于分配内存的资源(例如缓冲区对象、纹理、着色器)。它们不包括仅存储状态的对象(例如全局状态机、Framebuffer对象或顶点数组对象)。但是如果您正在考虑修改用于呈现的数据,我强烈建议您不要这样做。

每当GL在管道中有一个尚未完成的命令时,任何修改该命令使用的资源的尝试都会阻塞,直到命令完成为止。一个更好的解决方案将是双缓冲您的资源,有一个副本,您使用的呈现和单独的副本,您使用的更新。完成更新后,下次绘图线程使用该资源时,让它交换用于更新和绘图的缓冲区。这将减少驱动程序将工作线程与绘图线程同步的时间。

现在,如果您在这里建议您要从多个线程中提取,那么您应该重新考虑您的策略。OpenGL通常不会受益于从多个线程发出的绘制命令,它只是创建了一个同步噩梦。多线程主要用于控制多个窗口上的VSYNC (可能不会在ES中遇到)或后台的流资源数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20665346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档