在OpenGL中使用多个上下文进行多线程的正确方法是什么?

时间:2018-01-12 05:14:21

标签: c++ multithreading opengl

我正在尝试并行化我在OpenGL中创建的程序。我已经完全测试了我的代码的单线程版本,它的工作原理。我用valgrind运行它,事情很好,没有错误,没有内存泄漏,代码在我设法做的所有测试中表现得与预期完全一样。

在单线程版本中,我发送了一堆要渲染的立方体。我这样做是通过在名为" world"的数据结构中创建立方体,将OpenGL信息发送到另一个名为" Renderer"通过将它们附加到堆栈,最后我遍历队列并渲染每个对象。

由于单线程版本有效,我认为我的问题是我没有正确使用多个OpenGL上下文。

这些是管理我整个过程的3个函数:

main函数,初始化全局结构和线程。

int main(int argc, char **argv)
{
    //Init OpenGL
    GLFWwindow* window = create_context();

    Rendering_Handler = new Renderer();

    int width, height;
    glfwGetWindowSize(window, &width, &height);
    Rendering_Handler->set_camera(new Camera(mat3(1), 
        vec3(5*CHUNK_DIMS,5*CHUNK_DIMS,2*CHUNK_DIMS), width, height));

    thread world_thread(world_handling, window);

    //Render loop
    render_loop(window);
    //cleanup

    world_thread.join();

    end_rendering(window);
}

世界处理,它应该以它自己的线程运行:

void world_handling(GLFWwindow* window)
{
    GLFWwindow* inv_window = create_inv_context(window);
    glfwMakeContextCurrent(inv_window);

    World c = World();
    //TODO: this is temprorary, implement this correctly
    loadTexture(Rendering_Handler->current_program, *(Cube::textures[0]));

    while (!glfwWindowShouldClose(window))
    {
        c.center_frame(ivec3(Rendering_Handler->cam->getPosition()));
        c.send_render_data(Rendering_Handler);

        openGLerror();
    }

}

渲染循环,在主线程中运行:

void render_loop(GLFWwindow* window)
{
    //Set default OpenGL values for rendering
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glPointSize(10.f);

    //World c = World();

    //loadTexture(Rendering_Handler->current_program, *(Cube::textures[0]));
    while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        Rendering_Handler->update(window);

        //c.center_frame(ivec3(Rendering_Handler->cam->getPosition()));
        //c.send_render_data(Rendering_Handler);

        Rendering_Handler->render();

        openGLerror();
    }
}

注意第三个函数的注释,如果我取消注释掉然后注释掉主函数上的多线程状态(即单个线程我的程序)一切正常。

我不认为这是由竞争条件引起的,因为在渲染之前放置OpenGL信息的队列在使用之前总是被锁定(即每当线程需要读取或写入时队列,线程锁定互斥锁,读取或写入队列,然后解锁互斥锁。)

有人对我可能做错了什么有直觉吗?它是OpenGL上下文吗?

0 个答案:

没有答案