Я пишу ігровий движок, який складається з декількох модулів. Два з них - графічний двигун та двигун фізики .
Цікаво, чи є хорошим рішенням обмін даними між ними?
Два способи (поділитися чи ні) виглядає так:
Без обміну даними
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 просто покаже на них.
Який шлях краще?
Що спричинить більше проблем у майбутньому?
Мені більше подобається друге рішення, але мені цікаво, чому більшість графічних і фізичних двигунів віддають перевагу першому (можливо, тому, що вони зазвичай роблять лише графіку або лише двигун фізики, а хтось ще підключає їх у грі?).
Чи є у них більше прихованих плюсів і контрастів?