OStack程序员社区-中国程序员成长平台

标题: ios - 可以为每个线程创建 EAGLContext 吗? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 17:23
标题: ios - 可以为每个线程创建 EAGLContext 吗?

我想在并发 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-推荐答案


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

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

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

关于ios - 可以为每个线程创建 EAGLContext 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665346/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4