J'écris le moteur de jeu qui se compose de quelques modules. Deux d'entre eux sont le moteur graphique et le moteur physique .
Je me demande si c'est une bonne solution pour partager des données entre eux?
Deux façons (partage ou non) ressemble à ça:
Sans partager de données
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
Je vois deux problèmes principaux:
- Beaucoup de données redondantes (comme deux positions pour les données physiques et graphiques)
- Problème de mise à jour des données (je dois mettre à jour manuellement les données graphiques lorsque les données physiques changent)
Avec le partage de données
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)
Problèmes ici:
- physicsEngine ne peut pas créer de nouveaux objets, juste "évaluer" ceux existants à partir de engine3D (en quelque sorte, cela semble plus anti-indépendant pour moi)
- Cast de données dans la fonction assingModel3D
- physicsEngine et graphicsEngine doivent être prudents - ils ne peuvent pas supprimer les données lorsqu'ils n'en ont pas besoin (car le second peut en avoir besoin). Mais c'est une situation rare. De plus, ils peuvent simplement supprimer le pointeur, pas l'objet. Ou nous pouvons supposer que graphicsEngine supprimera les objets, physicsEngine ne fait que les pointer vers eux.
Quelle voie est meilleure?
Qui va générer plus de problèmes à l'avenir?
J'aime davantage la deuxième solution, mais je me demande pourquoi la plupart des moteurs graphiques et physiques préfèrent la première (peut-être parce qu'ils ne font normalement que des graphiques ou uniquement un moteur physique et que quelqu'un d'autre les connecte dans le jeu?).
Ont-ils des avantages et des contras plus cachés?