gpt4 book ai didi

C++ & DirectX - 几何问题

转载 作者:行者123 更新时间:2023-11-30 04:37:38 25 4
gpt4 key购买 nike

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

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

在这个设计中,我的渲染过程包括一个几何缓存步骤。所以,渲染器有一些类似 map 的容器

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)

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

你怎么看?也许一些替代方法?现代引擎如何处理几何预缓存?

最佳答案

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

鉴于 GeometryCachedGeometry 是您控制的对象,您可以做任何您想做的事来维持它们之间的链接。一种方法是建立双向链接:Geometry 和 CachedGeometry 都有指向彼此的指针,如果 CachedGeomitry 被销毁,它会告诉 Geometry 将对其 CachedGeometry 的引用设为空>。如果您的应用程序是单线程的,这可能非常简单。如果不是,它仍然可行,但需要您考虑如何处理(或防止)在半空中删除对象的情况。

关于C++ & DirectX - 几何问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3727408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com