Estoy escribiendo el motor del juego que consta de pocos módulos. Dos de ellos son el motor de gráficos y el motor de física .
Me pregunto si es una buena solución compartir datos entre ellos.
Dos formas (compartir o no) se ven así:
Sin compartir datos
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
Veo dos problemas principales:
- Una gran cantidad de datos redundantes (como dos posiciones para datos físicos y gráficos)
- Problema con la actualización de datos (tengo que actualizar manualmente los datos gráficos cuando cambian los datos físicos)
Con compartir datos
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)
Problemas aquí:
- physicsEngine no puede crear nuevos objetos, simplemente "evaluar" los existentes de engine3D (de alguna manera se ve más anti-independiente para mí)
- Transmitir datos en la función assingModel3D
- physicsEngine y graphicsEngine deben tener cuidado: no pueden eliminar datos cuando no los necesitan (porque el segundo puede necesitarlos). Pero es una situación rara. Además, solo pueden eliminar el puntero, no el objeto. O podemos suponer que graphicsEngine eliminará objetos, physicsEngine simplemente les señalará.
¿Qué camino es mejor?
¿Cuál producirá más problemas en el futuro?
Me gusta más la segunda solución, pero me pregunto por qué la mayoría de los motores de gráficos y física prefieren la primera (¿tal vez porque normalmente solo hacen gráficos o solo motores de física y alguien más los conecta en el juego?).
¿Tienen más pros y contras ocultos?