Estou escrevendo o mecanismo de jogo que consiste em poucos módulos. Dois deles são os mecanismo gráfico e o mecanismo de física .
Gostaria de saber se é uma boa solução para compartilhar dados entre eles?
Duas maneiras (compartilhando ou não) são assim:
Sem compartilhar dados
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
Eu vejo dois problemas principais:
- Muitos dados redundantes (como duas posições para dados físicos e gráficos)
- Problema com a atualização de dados (tenho que atualizar manualmente os dados gráficos quando os dados da física são alterados)
Com compartilhamento de dados
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 aqui:
- physicsEngine não pode criar novos objetos, apenas "avaliando" os existentes no engine3D (de alguma forma, parece mais anti-independente para mim)
- Transmitindo dados na função assingModel3D
- physicsEngine e graphicsEngine deve ter cuidado - eles não podem excluir dados quando não precisam deles (porque o segundo pode precisar). Mas é uma situação rara. Além disso, eles podem simplesmente excluir o ponteiro, não o objeto. Ou podemos assumir que graphicsEngine excluirá objetos, physicsEngine apenas ponteiros para eles.
Qual caminho é melhor?
O que produzirá mais problemas no futuro?
Gosto mais da segunda solução, mas me pergunto por que a maioria dos mecanismos gráficos e de física prefere a primeira (talvez porque normalmente produzem apenas gráficos ou apenas mecanismo de física e alguém os conecte no jogo?).
Eles têm mais prós e contras escondidos?