我正在查看Ogre3D代碼和WildMagic代碼,我發現它們的核心類有點不同。自從我創建自己的核心以來,我一直在想,哪種做法更好,在資源方面可能會更好。繼承,組合和多個成員變量的優點/缺點
在WildMagic中,有一個Matrix類繼承自Table類(不是多態)。表類可以有N行和N列,併爲列和行獲取getter和setter。 Matrix類具有隻對Matrix有意義的功能,並且可以方便地從Table繼承。在這種情況下,一個向量也可以繼承自Table(儘管WildMagic不這麼做)。 WildMagic還有一個Transform對象,用於存儲節點的本地和派生轉換。所以一個節點將有兩個Transform對象包含必要的轉換(包括位置,旋轉,縮放)。
在OGRE3D,另一方面,Matrix類不從任何派生和OGRE3D的節點變量來存儲本地和派生的位置:Vector localPos; Vector derPos; Matrix localRot; Matrix derRot; etc.
現在記住這些都是將用於核心對象/每幀更新/修改數千次,如果你意識到當你有一個完整的遊戲依賴於這些核心類時你會遇到性能瓶頸,那麼很難改變它們。
所以,現在的問題是:
- 有一個矩陣類與表類繼承VS矩陣類放在第一位做的一切相關的成本
- 是否與具有3個相關的成本一個Node類中的Transform對象的實例,以及通過成員變量暴露底層數據類型(我知道在這兩種情況下,它都是組合的,只是在一種情況下,有一個
wrapper
用於轉換,而另一種情況下是轉換我想這個問題可以修改爲:Does a wrapper have a cost (considering it is an object that needs to be created and destroyed)?
- 假設我正在編寫一個應用程序,其中每個計算(甚至是一個簡單的Vector添加)都是非常重要的。你會改變你的選擇嗎?
很好的答案。也許需要補充的是,我在演示中看到有關控制檯編程:您可能還想考慮緩存性能(像cachegrind這樣的工具可以告訴您這是否值得研究),同類數據佈局可能會提高緩存性能。如果你所有的矩陣數據都屬於一個很好的矩形內存塊,那很好,但是如果它被許多其他的核心計算所不需要的類變量所穿插,你可能會破壞緩存的性能。有時過度OO可能會產生負面影響......但在您優化之前始終檢查! – 2011-06-05 23:00:59
如果你鏈接的文章給人的印象是總是有繼承的代價,那麼恐怕我寫這篇文章是失敗的。繼承並不總是要花費的,並且通常這個類可以和純粹獨立的類一樣完全相同。 (調用虛擬成員甚至不需要花費)。在問題描述等非多態繼承的情況下,成本很可能爲零。 – 2011-06-18 10:41:22