C ++ OpenGL螺纹地形崩溃

时间:2013-08-18 01:08:45

标签: c++ multithreading opengl terrain quadtree

enter image description here

目标是什么:

我对线程比较新。我一直在尝试制作四叉树渲染的地形,这将快速有效地渲染。如果全部处于最大细节,则当前渲染的地形量将主要滞后于用户。这就是我使用QuadTree渲染它的原因。该引擎还支持输入和物理,因此我决定使用渲染线程。这造成了很多问题。

问题( 当我没有进行线程处理时,由于引擎中的其他系统存在一些延迟。导致延迟的主要原因是QuadTree中地形的加载和删除(我甚至不确定这是否是最佳方式。)现在,渲染发生得非常快,并且似乎没有滞后。当相机静止不动时,游戏运行良好。我让游戏运行了一个小时,没有发现崩溃。

当加载terrain时,它使用渲染代码使用的几个变量。即,绑定缓冲区 -

    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
    glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);

我相信这个变量与另一个线程同时被访问。这会导致崩溃。如何解决这个问题?我尝试过使用互斥锁,但这似乎不起作用。我将锁定和解锁互斥锁以解决此问题?

另一个似乎导致相同错误的变量是“IsLeaf”。

加载大量地形后会导致另一次崩溃(std :: badAlloc)。即使它正在清理。我认为这是由于我的删除代码,但我不知道什么是错的。

我目前添加和删除图块的方式是从相机检查范围并删除/创建图块。我想渲染我正在打开的瓷砖和它周围的瓷砖。但是,从4个主要切片中的一个切换时,这不起作用。使用范围创建不起作用,因为它是大瓷砖中心的范围而不是较小的瓷砖。我也尝试每隔几秒删除整个地图,这似乎也有效,但有更多的滞后。有没有更好的方法来创造和破坏?

在不同的决议之间存在差距。反正有减少这些吗?目前我渲染的瓷砖比它们需要的大一点,但这对主要的分辨率变化没有帮助。

如果您知道如何解决其中一个错误,我们将不胜感激。

代码(此处上传太多)

http://pastebin.com/MwXaymG0

http://pastebin.com/2tRbqtEB

1 个答案:

答案 0 :(得分:5)

OpenGL上下文一次只能绑定到一个线程(通过Windows上的wglMakeCurrent())。

因此,您不应该跨线程使用gl *函数,即使您使用Mutexes来保护对内存中某些变量的访问,调用也会失败。

我建议将gl *调用移动到渲染线程中,但是,在其他线程中有地形加载,平截头体计算,剪裁等内容。渲染线程只需要检查对象是否有新数据,然后执行相应的GL调用作为更新/渲染的一部分。