gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:49 24 4
gpt4 key购买 nike

我想在并发 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 渲染的最佳做法是什么?

最佳答案

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com