我的工作在我自己的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