簡體   English   中英

C ++ OpenGL線程地形崩潰

[英]C++ OpenGL Threaded Terrain Crashing

在此處輸入圖片說明

目的是:

我對線程技術比較陌生。 我一直在嘗試使四叉樹渲染的地形能夠快速高效地渲染。 如果所有細節都是最大細節,當前渲染的地形量將大大落后於用戶。 這就是為什么我使用QuadTree渲染它的原因。 該引擎還支持輸入和物理,因此我決定使用渲染線程。 這引起了很多問題。

問題:當我不執行線程操作時,由於引擎中的其他系統,出現了一些滯后。 導致滯后的主要原因是QuadTree中地形的加載和刪除(我什至不確定這是否是實現該目標的最佳方法。)現在,渲染速度非常快,而且似乎也沒有滯后。 當相機靜止不動時,游戲運行正常。 我將游戲運行了一個小時,沒有發現崩潰。

加載地形時,它會使用渲染代碼使用的多個變量。 即,綁定緩沖區-

    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);

我相信這個變量與另一個線程同時被訪問。 這會導致崩潰。 如何解決這個問題? 我曾嘗試使用Mutexes,但這似乎不起作用。 我將在哪里鎖定和解鎖互斥鎖以解決此問題?

似乎引起相同錯誤的另一個變量是“ IsLeaf”。

加載大量地形后,導致另一次崩潰(std :: badAlloc)。 即使它正在清理。 我認為這是由於我的刪除代碼引起的,但我不知道出了什么問題。

我目前添加和刪除圖塊的方式是檢查相機的范圍並刪除/創建圖塊。 我要渲染我所在的瓷磚及其周圍的瓷磚。 但是,從4個主圖塊之一過渡時,此方法不起作用。 使用范圍進行創建無效,因為它是到大圖塊中心而不是較小圖塊中心的范圍。 我還嘗試每隔幾秒鍾刪除整個地圖,這似乎也可行,但滯后時間更長。 有沒有更好的方法來進行創建和銷毀?

不同的分辨率之間存在差距。 無論如何有減少這些? 目前,我渲染的瓷磚比實際需要的要大一些,但這對主要分辨率的更改沒有幫助。

如果您有任何解決這些錯誤的方法的想法,將不勝感激。

代碼(此處太多,無法上傳)

http://pastebin.com/MwXaymG0

http://pastebin.com/2tRbqtEB

一次只能將OpenGL上下文綁定到一個線程(通過Windows上的wglMakeCurrent())。

因此,即使您使用Mutexes保護對內存中某些變量的訪問,也不應在線程之間使用gl *函數,否則調用將失敗。

我的建議是將gl *調用移至渲染線程中,但是在其他線程中有諸如地形加載,平截頭體計算,剪切等內容。 呈現線程僅需要檢查對象是否具有新數據,然后在其更新/呈現過程中執行適當的GL調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM