我正在尝试并行化我在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上下文吗?