菜鸟教程小白 发表于 2022-12-12 17:23:11

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


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

<pre><code>queue_ = dispatch_queue_create(&#34;test.queue&#34;, DISPATCH_QUEUE_CONCURRENT);


    dispatch_async(queue_, ^{
    NSMutableDictionary* threadDictionary = [ threadDictionary];
    EAGLContext* context = threadDictionary[@&#34;context&#34;];
    if (!context) {
      context = /* creating EAGLContext with sharegroup */;
      threadDictionary[@&#34;context&#34;] = context;
    }

    if () {
      // rendering
      ;
    }

});
</code></pre>

<p>如果不正确,并行化 OpenGL 渲染的最佳做法是什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这不仅没问题,而且这是您可以在多个线程之间共享 OpenGL 资源的<strong><em>唯一</em></strong>方式。请注意,可共享资源通常仅限于分配内存的资源(例如缓冲区对象、纹理、着色器)。它们不包括仅存储状态的对象(例如全局状态机、帧缓冲区对象或顶点数组对象)。但是,如果您正在考虑修改用于渲染的数据,我强烈建议您不要这样做。</p>

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

<p>现在,如果您在这里建议您要从多个线程中提取,那么您应该重新考虑您的策略。 OpenGL 通常不会从多个线程发出绘图命令中受益,它只会造成同步噩梦。多线程主要用于控制多个窗口上的 VSYNC(在 ES 中可能不会遇到)或在后台流式传输资源数据。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 可以为每个线程创建 EAGLContext 吗?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/20665346/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/20665346/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 可以为每个线程创建 EAGLContext 吗?