2010-09-16 48 views
1

我的工作在我自己的3D引擎,並有以下問題:C++和DirectX的 - 幾何題

我有一個抽象的對象,它處理幾何(頂點和麪)。它爲這個幾何體使用內部存儲器,允許編輯,而我的渲染器對象有一個方法RenderGeometry

使用此設計,我的渲染過程包括geometry caching步驟。因此,渲染器有一些地圖狀容器

std::map<Geometry*, CachedGeometry*> map; 

這裏Geometry代表我自己的幾何存儲和CachedGeometry意味着對特定的硬件指標和頂點緩衝區,則可以顯示(在DirectX 9的情況下,這些將是IDirect3D9VertexBuffer*IDirect3D9IndexBuffer*


的,那麼,一切都看起來不錯,是非常方便儘管如此,每Geometry*渲染調用有一個巨大的開銷。 - 時間找到Geometry*對象在我的內部存儲,然後才渲染CachedGeometry*

在簡單場景的情況下,這個開銷當然是最小的,但是當我試圖渲染具有大量小空間對象(補丁)的景觀時,分析表明大約20%的時間花在渲染實際上用於std::map查找。

基於散列的容器(boost::unordered_map,實際上)顯示性能更差(爲什麼?)和比例上調至35%。


所以 - 總結一切 - 在這種情況下該怎麼辦?我猜這個設計真的很舒服,並且「適當」,但是具有抽象性能損失。

我想可能是我應該嘗試「令人討厭」的方針,引進像StoreGeometry在我的渲染器,這將返回對象指數(int,例如)方法,使RenderGeometry方法會是什麼樣子RenderGeometry(int stored_geometry_index)

雖然這看起來很糟糕,但它可能會幫助我減少查找開銷。

您怎麼看?也許有一些替代方法?現代引擎對幾何預讀有什麼作用?

+0

「Geometry *」不能只保存一個指向其「CachedGeometry」實例的指針,完全避免查找? – jalf 2010-09-16 15:15:02

回答

2

我很驚訝std::map表現如此糟糕。它可能是值得問一個問題(先搜索現有的答案!)具體關於指針上的std :: map性能。

由於GeometryCachedGeometry是您控制的對象,因此您可以做任何事情來維護它們之間的鏈接。一種方法是將鏈接設置爲雙向:Geometry和CachedGeometry都具有指向彼此的指針,並且如果CachedGeomitry被銷燬,它會告知Geometry將引用指向CachedGeometry。如果你的應用程序是單線程的,這可能非常簡單。如果不是,它仍然是可行的,但會要求你考慮如何處理(或防止)在空中刪除對象時的情況。