0

我想将面向数据的设计(基于例如这篇文章)应用于我的简单物理引擎。我专注于优化碰撞测试,因为它是其中最昂贵的部分。

我已经将可能与玩家碰撞的边界球体组织成单一的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;

我在单个函数/方法中测试与它们的冲突。在那一点上,一切对我来说都很清楚。

问题是,我还有一些更通用的结构,例如:

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.

我必须摆脱内部vectorpoints)吗?如果有怎么办?

4

1 回答 1

0

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

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

于 2015-10-11T17:47:54.820 回答