Я пишу игровой движок, который состоит из нескольких модулей. Два из них - графический движок и физический движок .
Интересно, это хорошее решение для обмена данными между ними?
Два способа (делиться или нет) выглядит так:
Без обмена данными
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 будет удалять объекты, физика Engine просто указывает на них.
Какой способ лучше?
Что создаст больше проблем в будущем?
Мне больше нравится второе решение, но мне интересно, почему большинство графических и физических движков предпочитают первое (может быть, потому, что они обычно делают только графический или только физический движок, и кто-то еще подключает их в игре?).
Есть ли у них какие-то скрытые плюсы и минусы?