C++ C++&;DirectX-几何问题

C++ C++&;DirectX-几何问题,c++,performance,geometry,directx,C++,Performance,Geometry,Directx,我正在开发自己的3d引擎,有以下问题: 我有一个抽象对象,它处理几何体(顶点和面)。它使用此几何体的内部存储,允许编辑,并且我的渲染器对象具有一种方法RenderGeometry 通过这种设计,我的渲染过程包括一个几何缓存步骤。所以,渲染器有一些类似于贴图的容器 std::map<Geometry*, CachedGeometry*> map; std::map; 这里,Geometry代表我自己的几何存储,CachedGeometry表示一对硬件特定的索引和顶点缓冲区,然后可以

我正在开发自己的3d引擎,有以下问题:

我有一个抽象对象,它处理几何体(顶点和面)。它使用此几何体的内部存储,允许编辑,并且我的渲染器对象具有一种方法
RenderGeometry

通过这种设计,我的渲染过程包括一个
几何缓存
步骤。所以,渲染器有一些类似于贴图的容器

std::map<Geometry*, CachedGeometry*> map;
std::map;
这里,
Geometry
代表我自己的几何存储,
CachedGeometry
表示一对硬件特定的索引和顶点缓冲区,然后可以显示(在DirectX 9的情况下,这些将是
IDirect3D9VertexBuffer*
IDirect3D9IndexBuffer*


而且,一切看起来都很好,非常方便。尽管如此,每个
Geometry*
渲染调用都有巨大的开销-在我的内部存储器中找到
Geometry*
对象,然后才渲染
CachedGeometry*

对于简单场景来说,这种开销当然是最小的,但是当我试图用大量的小空间对象(补丁)渲染一个场景时,分析显示渲染所花费的大约20%的时间实际上用于
std::map
查找

基于散列的容器(
boost::unordered_-map
)表现出更差的性能(为什么?)


所以,总而言之,在这种情况下我应该怎么做呢?我想这种设计真的很舒适和“合适”,但有抽象性能的损失

我认为我可能应该尝试“nastier”方法,并在渲染器中引入类似于
StoreGeometry
的方法,该方法将返回对象索引(
int
),以便
RenderGeometry
方法看起来像
RenderGeometry(int-stored\u-geometry\u-index)

虽然这看起来很糟糕,但它可能会帮助我减少查找开销


你怎么看?也许是其他方法?现代引擎在几何体预处理方面做了什么?

我很惊讶
std::map
的性能如此糟糕。也许值得问一个问题(先搜索现有答案!),特别是关于指针上的std::map性能


考虑到
Geometry
CachedGeometry
是您可以控制的对象,您可以做任何您想维护它们之间链接的事情。一种方法是使链接双向:几何体和CachedGeometry都有指向彼此的指针,如果CachedGeometry被破坏,它会告诉
Geometry
将对i的引用设为空如果你的应用程序是单线程的,这可能非常简单。如果不是,这仍然是可行的,但需要你思考如何处理(或防止)在空中删除对象时的情况。

几何体*不能只保留一个指向其
CachedGeometry
实例的指针,完全避免查找吗?