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