我正在编写一个由几个模块组成的游戏引擎。其中两个是图形引擎和物理引擎。
我想知道在他们之间共享数据是否是一个好的解决方案?
两种方式(共享与否)看起来像这样:
不共享数据
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
我看到两个主要问题:
- 大量冗余数据(例如物理和图形数据的两个位置)
- 更新数据的问题(我必须在物理数据更改时手动更新图形数据)
通过共享数据
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)
这里的问题:
physicsEngine
无法创建新对象,只需从 engine3D 中“分配”现有对象(不知何故,它对我来说看起来更加反独立)- 在 assignModel3D 函数中转换数据
physicsEngine
并且graphicsEngine
必须小心 - 当他们不需要数据时,他们不能删除数据(因为第二个可能需要它)。但这是一种罕见的情况。此外,他们可以只删除指针,而不是对象。或者我们可以假设这graphicsEngine
将删除对象,physicsEngine
只是指向它们的指针。
哪种方式更好?
未来哪个会产生更多的问题?
我更喜欢第二种解决方案,但我想知道为什么大多数图形和物理引擎更喜欢第一种(可能是因为它们通常只制作图形或只制作物理引擎,而其他人在游戏中将它们连接起来?)。
他们还有更多隐藏的优点和缺点吗?