2011-12-29 102 views
3

我有一個用C++編寫的用opengl編寫的標準場景圖。優化場景圖

我的場景圖有節點和形狀。

節點是矩陣,並且在應用它們的矩陣之後繪製所有的孩子。

void Node::draw(Affine3f amatrix) const 
{ 
    amatrix = amatrix * matrix; 
    for (Drawable* child : childern) 
    { 
     child->draw(amatrix); 
    } 
} 

形狀是簡單地打包維也納各組織,他們採取的矩陣從所述繪製調用,將其設置爲均勻的模型視圖矩陣,然後繪製VBO。

void Shape::draw(Affine3f mat) const 
{ 
    renderer.setModelView(mat); 
    myVertices.draw(); 
} 

我喜歡這個設計,它非常簡單靈活。但是,這是非常低效的,大量的CPU端矩陣乘法和大量的繪製調用。

我的問題是:

如何我可以優化該設計,同時去除不需要的矩陣乘法和不必要的繪製調用?

就像不重新計算矩陣每個繪製(只計算改變)和聯合形狀,以便他們可以用一個調用繪製。

一些詳細信息:

  • 形狀是靜態的(現在),包含的頂點將永遠不會改變。
  • 有靜態幾何(住在沒有操縱根節點)和動態幾何(操作節點的孩子)
+0

如果你能更清楚地定義你想要的東西,它會更容易回答。從我的角度來看,除非您創建不必要的節點(這不是設計問題,而是您如何使用它),否則您的設計既不包含未計算的矩陣乘法,也不包含不必要的繪製調用。那麼你到底需要什麼,以及如何進行不必要的乘法/繪製調用? – Grizzly 2011-12-29 16:28:58

回答

4

一兩件事,我會通過對輸入矩陣A const &的混合。你正在傳遞價值,如果你有一些功能最終不需要對矩陣做任何特殊的處理,那麼這是很多不必要的複製。

如果要防止矩陣計算,如果矩陣沒有改變,您需要有一個「髒」標誌來確定矩陣的值是否因上次使用而改變。 RenderWare用它的矩陣做了這樣的事情。否則,就像在評論中一樣,沒有看到你的整體設計,沒有什麼內在的錯誤,你有什麼。

2

您是否正在繪製樹中的每個元素,即使它不可見?如果是這樣,你應該檢查出八進制來過濾不可見的節點。

您也可以嘗試在着色器中進行大多數矩陣計算,方法是將它們作爲變量傳遞。我也看到你的矩陣是仿射的,但是在你的實現中你可能仍然做一個昂貴的逆向計算。如果是這樣的話,你可以檢查我的tutorial,看看如何使它便宜。