Birkaç modülden oluşan oyun motorunu yazıyorum. Bunlardan ikisi grafik motoru ve fizik motorudur .
Aralarında veri paylaşmak iyi bir çözüm mü?
İki yol (paylaşıp paylaşmama) şöyle görünür:
Veri paylaşmadan
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
İki ana sorun görüyorum:
- Çok fazla veri (hem fizik hem de grafik verileri için iki konum gibi)
- Veri güncelleme sorunu (Fizik verileri değiştiğinde grafik verilerini manuel olarak güncellemem gerekiyor)
Veri paylaşımı ile
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)
Buradaki sorunlar:
- PhysicsEngine yeni nesneler oluşturamaz, sadece engine3D'den mevcut olanları "atar" (bir şekilde benim için daha anti-bağımsız görünüyor)
- AssingModel3D işlevinde veri yayınlama
- PhysicsEngine ve graphicsEngine dikkatli olmalıdır - ihtiyaç duymadıklarında verileri silemezler (çünkü ikincisine ihtiyaç duyabilir). Ancak bu nadir bir durumdur. Dahası, sadece işaretçiyi silebilirler, nesneyi değil. Veya graphicsEngine nesnelerini sileceğini varsayabiliriz, physicsEngine sadece onlara işaret eder.
Hangi yol daha iyi?
Hangisi gelecekte daha fazla sorun yaratacak?
İkinci çözümü daha çok seviyorum, ama çoğu grafik ve fizik motorunun neden ilkini tercih ettiğini merak ediyorum (belki de normalde sadece grafik veya sadece fizik motoru yapıyorlar ve birileri oyuna bağlanıyor?).
Daha gizli profesyoneller ve kontratlar var mı?