• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 17:23:11 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想在并发 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap