4

我正在编写一个由几个模块组成的游戏引擎。其中两个是图形引擎物理引擎

我想知道在他们之间共享数据是否是一个好的解决方案?

两种方式(共享与否)看起来像这样:

不共享数据

GraphicsModel{
    //some common for graphics and physics data like position

    //some only graphic data 
    //like textures and detailed model's vertices that physics doesn't need
};

PhysicsModel{
    //some common for graphics and physics data like position

    //some only physics data 
    //usually my physics data contains A LOT more information than graphics data
}

engine3D->createModel3D(...);
physicsEngine->createModel3D(...);

//connect graphics and physics data 
//e.g. update graphics model's position when physics model's position will change

我看到两个主要问题:

  1. 大量冗余数据(例如物理和图形数据的两个位置)
  2. 更新数据的问题(我必须在物理数据更改时手动更新图形数据)

通过共享数据

Model{
     //some common for graphics and physics data like position
};

GraphicModel : public Model{
    //some only graphics data 
    //like textures and detailed model's verticles that physics doesn't need
};

PhysicsModel : public Model{
     //some only physics data 
    //usually my physics data contains A LOT more informations than graphics data
}

model = engine3D->createModel3D(...);
physicsEngine->assignModel3D(&model); //will cast to 
//PhysicsModel for it's purposes??

//when physics changes anything (like position) in model 
//(which it treats like PhysicsModel), the position for graphics data 
//will change as well (because it's the same model)

这里的问题:

  1. physicsEngine无法创建新对象,只需从 engine3D 中“分配”现有对象(不知何故,它对我来说看起来更加反独立)
  2. 在 assignModel3D 函数中转换数据
  3. physicsEngine并且graphicsEngine必须小心 - 当他们不需要数据时,他们不能删除数据(因为第二个可能需要它)。但这是一种罕见的情况。此外,他们可以只删除指针,而不是对象。或者我们可以假设这graphicsEngine将删除对象,physicsEngine只是指向它们的指针。

哪种方式更好?

未来哪个会产生更多的问题?

我更喜欢第二种解决方案,但我想知道为什么大多数图形和物理引擎更喜欢第一种(可能是因为它们通常只制作图形或只制作物理引擎,而其他人在游戏中将它们连接起来?)。

他们还有更多隐藏的优点和缺点吗?

4

1 回答 1

5

如今,更多的游戏引擎采用组件化设计(如Unity、Unreal)。在这种设计中,aGameObject由一系列组件组成。在您的情况下,可以有 aMeshComponent和 a PhysicalComponent,它们都附加到单个游戏对象。

为简单起见,您可以将世界变换变量放入GameObject. 在更新短语期间,PhysicalComponent将世界变换输出到该变量。在渲染期间,MeshComponent读取该变量。

这种设计背后的基本原理是在组件之间解耦。彼此都不认识MeshComponent,也不认识。PhysicalComponent它们只依赖于一个通用接口。并且通过组合来扩展系统比使用单一继承层次更容易。

然而,在现实场景中,您可能需要在物理/图形同步之间进行更复杂的处理。例如,物理模拟可能需要以固定的时间步长(例如 30Hz)运行,而渲染需要是可变的。您可能需要从物理引擎的输出中插入结果。一些物理引擎(例如 Bullet)虽然直接支持这个问题。

Unity 提供了他们的Components的一个很好的参考,值得一看。

于 2012-11-21T09:27:26.523 回答