我的工作在我自己的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)
。
雖然這看起來很糟糕,但它可能會幫助我減少查找開銷。
您怎麼看?也許有一些替代方法?現代引擎對幾何預讀有什麼作用?
「Geometry *」不能只保存一個指向其「CachedGeometry」實例的指針,完全避免查找? – jalf 2010-09-16 15:15:02