Saya sedang menulis mesin permainan yang terdiri dari beberapa modul. Dua di antaranya adalah mesin grafis dan mesin fisika .
Saya ingin tahu apakah ini solusi yang baik untuk berbagi data di antara mereka?
Dua cara (berbagi atau tidak) terlihat seperti itu:
Tanpa berbagi data
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
Saya melihat dua masalah utama:
- Banyak data yang berlebihan (seperti dua posisi untuk data fisika dan grafik)
- Masalah dengan memperbarui data (saya harus memperbarui data grafik secara manual ketika data fisika berubah)
Dengan berbagi data
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)
Masalah di sini:
- physicsEngine tidak dapat membuat objek baru, hanya "mengasumsikan" yang sudah ada dari engine3D (entah bagaimana itu terlihat lebih anti-independen untuk saya)
- Casting data dalam fungsi assingModel3D
- physicsEngine dan graphicsEngine harus berhati-hati - mereka tidak dapat menghapus data saat mereka tidak membutuhkannya (karena yang kedua mungkin membutuhkannya). Tapi ini situasi yang langka. Selain itu, mereka hanya dapat menghapus pointer, bukan objek. Atau kita dapat mengasumsikan bahwa graphicsEngine akan menghapus objek, physicsEngine hanya menunjuk ke mereka.
Jalan mana yang lebih baik?
Mana yang akan menghasilkan lebih banyak masalah di masa depan?
Saya lebih suka solusi kedua, tapi saya bertanya-tanya mengapa sebagian besar mesin grafis dan fisika lebih suka yang pertama (mungkin karena mereka biasanya hanya membuat grafik atau hanya mesin fisika dan orang lain menghubungkannya dalam permainan?).
Apakah mereka memiliki pro & kontra yang tersembunyi lagi?