Piszę silnik gry, który składa się z kilku modułów. Dwa z nich to silnik graficzny i silnik fizyki .
Zastanawiam się, czy dobrym rozwiązaniem jest udostępnianie danych między nimi?
Tak wyglądają dwa sposoby (udostępnianie lub nie):
Bez udostępniania danych
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
Widzę dwa główne problemy:
- Wiele nadmiarowych danych (jak dwie pozycje dla danych fizycznych i graficznych)
- Problem z aktualizacją danych (muszę ręcznie aktualizować dane graficzne, gdy zmieniają się dane fizyki)
Dzięki udostępnianiu danych
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)
Problemy tutaj:
- physicsEngine nie może tworzyć nowych obiektów, po prostu „zakłada” istniejące z silnika3D (jakoś dla mnie wygląda to bardziej anty-niezależne)
- Przesyłanie danych w funkcji assingModel3D
- physicsEngine and graphics Engine musi być ostrożny - nie może usuwać danych, gdy ich nie potrzebuje (ponieważ drugi może ich potrzebować). Ale to rzadka sytuacja. Co więcej, mogą po prostu usunąć wskaźnik, a nie obiekt. Lub możemy założyć, że graphicEngine usunie obiekty, physicsEngine po prostu wskaże do nich.
Który sposób jest lepszy?
Co spowoduje więcej problemów w przyszłości?
Bardziej podoba mi się drugie rozwiązanie, ale zastanawiam się, dlaczego większość silników graficznych i fizycznych preferuje pierwsze (może dlatego, że zwykle tworzą tylko grafikę lub tylko silnik fizyki, a ktoś inny łączy je w grze?).
Czy mają jeszcze ukryte zalety i kontrasty?