Sto scrivendo il motore di gioco composto da pochi moduli. Due di questi sono il motore grafico e il motore fisico .
Mi chiedo se sia una buona soluzione per condividere i dati tra di loro?
Due modi (condivisione o meno) assomigliano a quello:
Senza condividere i dati
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
Vedo due problemi principali:
- Molti dati ridondanti (come due posizioni sia per i dati fisici che grafici)
- Problema con l'aggiornamento dei dati (devo aggiornare manualmente i dati grafici quando cambiano i dati di fisica)
Con la condivisione di dati
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)
Problemi qui:
- physicsEngine non può creare nuovi oggetti, semplicemente "assecondando" quelli esistenti da engine3D (in qualche modo sembra più anti-indipendente per me)
- Trasmissione dei dati nella funzione assingModel3D
- motore fisico e graficoIl motore deve fare attenzione: non possono cancellare i dati quando non ne hanno bisogno (perché il secondo potrebbe averne bisogno). Ma è una situazione rara. Inoltre, possono semplicemente eliminare il puntatore, non l'oggetto. Oppure possiamo supporre che graphicsEngine eliminerà gli oggetti, PhysicsEngine semplicemente indicandoli.
In che modo è meglio?
Quale produrrà più problemi in futuro?
Mi piace di più la seconda soluzione, ma mi chiedo perché la maggior parte dei motori di grafica e fisica preferisca la prima (forse perché normalmente fanno solo grafica o solo motore di fisica e qualcun altro li collega nel gioco?).
Hanno altri pro e contras nascosti?