2010-09-16 44 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。如果你的应用程序是单线程的,这可能非常简单。如果不是,它仍然是可行的,但会要求你考虑如何处理(或防止)在空中删除对象时的情况。