2010-06-23 90 views
4

我有興趣將線程引入我在業餘時間工作的小型引擎,但我很好奇最好的approuch是什麼。我很好奇推薦的方法是將物理線程與引擎的其餘部分同步,類似於ThisGuy。我正在使用Bullet Physics SDK,它已經使用他描述的數據複製方法,但是我想知道,一旦子彈經過一次模擬,然後將數據同步回其他線程,是不是會導致類似垂直同步,渲染線程在處理數據的過程中突然開始使用一組更新且不同的信息?遊戲引擎的線程模型

這是觀衆能夠注意到的東西嗎?如果某種形式的爆炸出現在意圖被銷燬的物體上怎麼辦?

如果這是一個問題,那麼最好的解決方法是什麼?

鎖定物理線程,使其無法做任何事情,直到渲染線程(基本上每個其他線程)已經通過其框架?這似乎會浪費一些CPU時間。或者更好的方法是三重緩衝,將物理數據複製到第二個位置,繼續物理模擬,然後在準備好之後將該數據複製到渲染線程?

你們推薦什麼方法?

回答

2

最簡單也是最常用的變體是並行運行physic,render,ai,...線程,並在每個線程完成幀/時間步後將它們同步。 這不是最快的解決方案,但問題最少。 運行時將數據寫回到渲染線程會導致大量的同步問題(例如,在更新它時必須鎖定每個向量/矩陣)。 爲了實現高效率,您必須儘量減少要同步的數據量,例如,只將數據寫入渲染線程,可以渲染。

在每幀之後沒有重新合成時,您可能會得到這樣的效果:物理/ ai使用所有產生60fps的cpu功率,而渲染器僅渲染10fps,在大多數情況下不會顯示您想要的效果。

雙緩衝也會提高性能,但您仍然需要同步您的線程。一個問題是AI和物理或類似的線程,因爲他們可能想修改相同的數據