当结构在内部向量中包含各种数量的元素时,如何应用面向数据的设计?

Posted

技术标签:

【中文标题】当结构在内部向量中包含各种数量的元素时,如何应用面向数据的设计?【英文标题】:How to apply Data-Oriented Desing when an structure contains various number of elements in inner vector? 【发布时间】: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&lt;Polygon&gt; 不是一个好习惯,因为嵌套的vector (points) 会在内存中占据很多位置(保留它)。

另一方面,我不能假设总是有 2、3、4 或 10 个点(差异很大,最多大约 20 个,但通常要少得多)。

我确实想从Polygon 通用结构切换到例如一系列三角形(因为在许多计算中它比分离三角形更快)。

那我该怎么办?我想秉承面向数据设计的精神,通过我的Polygon 有效地使用内存/缓存。

我必须摆脱内心的vectorpoints)吗?如果是这样呢?

【问题讨论】:

对于对这个问题投反对票的人 - 你能指出我做错了什么,以便我改进这个问题吗?是不是不够清楚,或者出于某种原因我应该包含更多代码(我认为在spheres 上运行的函数在这里并不重要,但也许还有别的)? 我会说 -1 代表文本中粗体的数量。加上这个问题相当模糊,可能没有任何明确的答案。关于问题本身——嗯,这是一个很难的问题。我认为将多边形的点存储在向量中并且多边形本身具有第一点索引和点数将有助于一些 DOD。但是,如果在执行过程中添加/删除多边形或其中的点,显然会出现问题。 @Rostislav 我已经删除了大部分“粗体”,谢谢。我知道解决问题有点困难,但我在不同的地方一次又一次地面对它(多边形只是一个很好的例子)。你的建议听起来不错。特别是在创建区域后我通常不会添加/删除点(对象正在碰撞但没有变形,我很少删除它们)。您想将您的评论扩展到答案吗? 刚刚做到了。这是一个有趣的问题,你必须诚实。但请记住,任何性能问题都应该通过彻底的测量来测试。 【参考方案1】:

这个问题无法给出明确的答案,因为它需要了解您访问数据的方式,包括数据的初始化时间、初始化阶段之后是否可以更改以及许多其他问题。但是,如果您的数据相对稳定,并且您以一致的方式访问多边形,只是迭代所有多边形或属于一个特定对象的多边形,则一种方法可能是将多边形的点放入一个单独的向量中,然后将多边形存储该数组的开始和结束索引。

这样,在遍历过程中需要访问一些东西。首先,存储在多边形中的索引。二是点本身。如果多边形也布置在向量中,那么这两种访问都可能是缓存友好的。类似的方法可以应用于多边形集 - 只需将多边形存储在一个向量中,并在您的游戏对象中有一个(开始,结束)对。

【讨论】:

以上是关于当结构在内部向量中包含各种数量的元素时,如何应用面向数据的设计?的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据结构之链表

在android studio的apk中包含.so库[重复]

如何在线性布局中设置视图,使其适合从开始到结束的屏幕,并在一行中包含一定数量的元素?

如何在 WAR 存档中包含应用程序配置文件?

查找数据框中包含字符串向量中的一个元素的行的索引

当名称中包含冒号时通过其属性选择元素