
目的是什么:
我对线程比较陌生.我一直在尝试制作四叉树渲染的地形,这将快速有效地渲染.如果全部处于最大细节,则当前渲染的地形量将主要滞后于用户.这就是我使用QuadTree渲染它的原因.该引擎还支持输入和物理,因此我决定使用渲染线程.这导致了很多问题.
问题('s): 当我没有线程时,由于引擎中的其他系统存在一些滞后.造成延迟的主要原因是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);
Run Code Online (Sandbox Code Playgroud)
我认为这个变量与另一个线程同时被访问.这会导致崩溃.如何解决这个问题?我尝试过使用互斥锁,但这似乎不起作用.我将锁定和解锁互斥锁以解决此问题?
另一个似乎导致相同错误的变量是"IsLeaf".
加载大量地形后会导致另一次崩溃(std :: badAlloc).即使它正在清理.我认为这是由于我的删除代码,但我不知道什么是错的.
我当前添加和删除切片的方式是从相机检查范围并删除/创建切片.我想渲染我正在打开的瓷砖和它周围的瓷砖.但是,从4个主要切片中的一个切换时,这不起作用.使用范围创建不起作用,因为它是大瓷砖中心的范围而不是较小的瓷砖.我也尝试每隔几秒删除整个地图,这似乎也有效但但滞后更多.有没有更好的方法来创造和破坏?
在不同的决议之间存在差距.反正有减少这些吗?目前我渲染的瓷砖比它们需要的大一点,但这对主要的分辨率变化没有帮助.
如果您有任何想法如何解决其中一个错误,我们将不胜感激.
代码(这里上传太多了)