2011-06-05 103 views
2

我正在查看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.

現在記住這些都是將用於核心對象/每幀更新/修改數千次,如果你意識到當你有一個完整的遊戲依賴於這些核心類時你會遇到性能瓶頸,那麼很難改變它們。

所以,現在的問題是:

  1. 有一個矩陣類與表類繼承VS矩陣類放在第一位做的一切相關的成本
  2. 是否與具有3個相關的成本一個Node類中的Transform對象的實例,以及通過成員變量暴露底層數據類型(我知道在這兩種情況下,它都是組合的,只是在一種情況下,有一個wrapper用於轉換,而另一種情況下是轉換我想這個問題可以修改爲:Does a wrapper have a cost (considering it is an object that needs to be created and destroyed)?
  3. 假設我正在編寫一個應用程序,其中每個計算(甚至是一個簡單的Vector添加)都是非常重要的。你會改變你的選擇嗎?

回答

2

非常好,複雜的問題與許多很多答案。我會盡力解決他們的問題,但至少在我看來,整體的答案將會更多地滿足你的需求,而不是單個人可能做的事情。

1)繼承總是有成本的,儘管它非常微小。是不是真的有一個簡單的回答這個問題,所以我可能會讀:即必須創建或銷燬擁有成本 http://www.hackcraft.net/cpp/templateInheritance/

2)任何。通常包裝的東西使他們對項目中的大量人更「安全」,但除此之外,我認爲它沒有用處或價值。就像繼承一樣,包裝物品的成本非常小。 3)如果每一次計算都很重要,那麼如果你不需要的話,不要包裝一些東西。至少對於簡單的數學類,只需使用模板來簡化使用,而不是繼承。

總體而言,對於矩陣和向量的基本數據結構,如果您的程序在PC或控制檯上採用任一方法,您都不會殺死您的程序。緩慢的內存管理器和內存分配會比繼承你的向量和矩陣類更多地殺死你的遊戲。

+0

很好的答案。也許需要補充的是,我在演示中看到有關控制檯編程:您可能還想考慮緩存性能(像cachegrind這樣的工具可以告訴您這是否值得研究),同類數據佈局可能會提高緩存性能。如果你所有的矩陣數據都屬於一個很好的矩形內存塊,那很好,但是如果它被許多其他的核心計算所不需要的類變量所穿插,你可能會破壞緩存的性能。有時過度OO可能會產生負面影響......但在您優化之前始終檢查! – 2011-06-05 23:00:59

+1

如果你鏈接的文章給人的印象是總是有繼承的代價,那麼恐怕我寫這篇文章是失敗的。繼承並不總是要花費的,並且通常這個類可以和純粹獨立的類一樣完全相同。 (調用虛擬成員甚至不需要花費)。在問題描述等非多態繼承的情況下,成本很可能爲零。 – 2011-06-18 10:41:22

0

如果您沒有進行虛函數調用,那麼從純粹的性能角度來看,它並不重要。我個人會不贊同任何其他解決方案的繼承。小包裝器對象將由編譯器進行優化。不過,我並不完全鼓勵你將OGRE3D視爲一個優秀設計的巔峯 - 它們充滿了單身人士。

+0

哈哈什麼,不幸的是,很多的遊戲代碼!單身人士在這裏一般都被社區所詬病(我可以加上很堅實的理由),但是他們在製作遊戲引擎中被大量使用。 – Samaursa 2011-06-05 23:26:10

0

對於(1),你肯定沒有多態性嗎?在繼承方面,虛函數調用是效率最高的。如果沒有虛擬功能,兩者之間幾乎沒有區別,並且絕對沒有區別可以推廣。也許這些對象在內存中的佈局與其他對象的內存不同,也許你會有不同的大小,其中更多的浪費緩衝區就是這樣。對於(2),這一切都歸結爲代碼被優化的可能性。通常,如果相關函數都容易內聯,輕量級包裝盒中將不會有很多實際的函數調用。但是,再次,可能會導致內存佈局等後果。它很難在抽象中預測。

對於(3),我還沒有做出選擇,所以我不知道你指的:-P