我正在编写包含几个模块的游戏引擎。其中两个是图形引擎和物理引擎。
我想知道这是否是在他们之间共享数据的好解决方案?
两种方式(是否共享)如下所示:
不共享数据
GraphicsModel{
//some common for graphics and physics data like position
//some only graphic data
//like textures and detailed model's verticles 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 informations 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->assingModel3D(&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中“确定”现有对象(以某种方式看来对我来说是反独立的)
- 在assingModel3D函数中投射数据
- physicsEngine和graphicsEngine必须小心-它们在不需要数据时不能删除数据(因为第二个可能需要它)。但这是罕见的情况。而且,他们只能删除指针,而不能删除对象。或者我们可以假设graphicsEngine将删除对象,physicsEngine只是指向它们的指针。
哪种方法更好?
将来哪些会产生更多问题?
我更喜欢第二种解决方案,但我想知道为什么大多数图形和物理引擎更喜欢第一种(也许是因为它们通常只制作图形或仅物理引擎,并且有人在游戏中将它们联系起来?)。
他们还有其他隐藏的利弊吗?