【发布时间】:2015-10-11 15:31:35
【问题描述】:
我想将面向数据的设计(基于例如this article)应用于我的简单物理引擎。我专注于优化碰撞测试,因为它是其中最昂贵的部分。
我已将可能与玩家碰撞的边界球组织成单个vector:
struct Sphere{ //I don't split sphere into parts,
//as I usually access both position and radius in my calculations
Point3D position;
float radius;
};
std::vector<BoudingSphere> spheres;
我在 single 函数/方法中测试与它们的碰撞。到那时,我觉得一切都很清楚。
问题是,我还有一些更通用的结构,例如:
struct Polygon{ //it may e.g. represents the area or be used for more precise tests
std::vector<Point2D> points;
};
我想以同样的方式创建std::vector<Polygon> 不是一个好习惯,因为嵌套的vector (points) 会在内存中占据很多位置(保留它)。
另一方面,我不能假设总是有 2、3、4 或 10 个点(差异很大,最多大约 20 个,但通常要少得多)。
我确实不想从Polygon 通用结构切换到例如一系列三角形(因为在许多计算中它比分离三角形更快)。
那我该怎么办?我想秉承面向数据设计的精神,通过我的Polygon 有效地使用内存/缓存。
我必须摆脱内心的vector(points)吗?如果是这样呢?
【问题讨论】:
-
对于对这个问题投反对票的人 - 你能指出我做错了什么,以便我改进这个问题吗?是不是不够清楚,或者出于某种原因我应该包含更多代码(我认为在
spheres上运行的函数在这里并不重要,但也许还有别的)? -
我会说 -1 代表文本中粗体的数量。加上这个问题相当模糊,可能没有任何明确的答案。关于问题本身——嗯,这是一个很难的问题。我认为将多边形的点存储在向量中并且多边形本身具有第一点索引和点数将有助于一些 DOD。但是,如果在执行过程中添加/删除多边形或其中的点,显然会出现问题。
-
@Rostislav 我已经删除了大部分“粗体”,谢谢。我知道解决问题有点困难,但我在不同的地方一次又一次地面对它(多边形只是一个很好的例子)。你的建议听起来不错。特别是在创建区域后我通常不会添加/删除点(对象正在碰撞但没有变形,我很少删除它们)。您想将您的评论扩展到答案吗?
-
刚刚做到了。这是一个有趣的问题,你必须诚实。但请记住,任何性能问题都应该通过彻底的测量来测试。
标签: c++ memory vector data-oriented-design