小编Nix*_*ixt的帖子

紧密物理和碰撞循环中的高速缓存友好存储器访问

我正在编写物理引擎,并且很难找到设计数据存储的好方法.

我想要的功能:

  • 有一个代表PhysicsBody的类
  • 有一个表示碰撞体积的类(让我们说一个盒子)
  • 每个物理主体可以再附加一个碰撞体积
  • 可能没有碰撞体积的物理体
  • 可选:没有物理实体的CollisionVolume.(想想Trigger Volumes)

现在我基本上有两个循环.一个更新模拟中的物理实体.它会更新它们的位置/速度/旋转.第二个循环对所有碰撞体积执行碰撞检测.它只是一个嵌套的for循环,用于检查每对碰撞体积之间的碰撞.(我知道它可以做得更好,但这是一个单独的主题)

我知道理想的方法是将对象存储在连续的数组中.

std::vector<PhysicsBody> m_bodies;
std::vector<CollisionVolume> m_colliders;
Run Code Online (Sandbox Code Playgroud)

我用这种方法发现的问题:

  • 它很难维护PhysicsBody - > CollisionVolume的关系.例如,如果我想从我的向量中删除CollisionVolume,我会将它与最后一个交换并弹回.数据被移动,如果我将一个索引存储到PhysicsBody中的CollisionVolume,它就不再有效了.
  • 每当我销毁一个PhysicsBody时,析构函数将检查是否有任何碰撞量附加到它上面,并从物理系统中适当地删除它.问题是向量将制作内部副本并销毁它们,当发生这种情况时,它会通过删除不应被删除的碰撞卷而造成严重破坏.
  • CollisionVolume实际上是一个基类(并非必须),而其他类派生类似于盒子/球体,什么不是.我可能不会使用继承并提出一些其他复杂的设计,但这是需要记住的.

我努力寻找解决方法,但最终存储了指针:

std::vector<PhysicsBody*> m_bodies;
std::vector<CollisionVolume*> m_colliders;
Run Code Online (Sandbox Code Playgroud)

我想出的最小化缓存未命中的最佳解决方案是重载新/删除并将这些对象存储在内存池中,仅用于物理系统.

还有其他更好的解决方案吗?显然,表现是关键.

c++ performance memory-management game-physics data-oriented-design

6
推荐指数
1
解决办法
485
查看次数

同步MATLAB和C++

我有一个C++程序,它连续从kinect传感器(usung opencv)获取深度帧并将它们保存到png.我有另一个MATLAB脚本来读取这些图像并处理它们.

问题是MATLAB无法读取png,因为C++程序可能比MATLAB读取文件更快地覆盖文件.我想如果图像写入和读取可以同步,问题就可以解决了.

有什么可能是实现这一目标的最简单方法?只要解决方案有效,我愿意接受一些性能提升.

c++ matlab opencv synchronize

3
推荐指数
1
解决办法
158
查看次数