Tôi đang viết công cụ trò chơi bao gồm một vài mô-đun. Hai trong số đó là công cụ đồ họa và công cụ vật lý .
Tôi tự hỏi nếu nó là một giải pháp tốt để chia sẻ dữ liệu giữa họ?
Hai cách (chia sẻ hay không) trông như thế:
Không chia sẻ dữ liệu
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
Tôi thấy hai vấn đề chính:
- Rất nhiều dữ liệu dư thừa (như hai vị trí cho cả dữ liệu vật lý và đồ họa)
- Sự cố với việc cập nhật dữ liệu (Tôi phải cập nhật thủ công dữ liệu đồ họa khi dữ liệu vật lý thay đổi)
Với việc chia sẻ dữ liệu
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)
Vấn đề ở đây:
- vật lýEngine không thể tạo các đối tượng mới, chỉ "khẳng định" các đối tượng hiện có từ engine3D (bằng cách nào đó nó có vẻ chống độc lập hơn đối với tôi)
- Truyền dữ liệu trong hàm assingModel3D
- vật lýEngine và đồ họaEngine phải cẩn thận - họ không thể xóa dữ liệu khi họ không cần chúng (vì cái thứ hai có thể cần nó). Nhưng đó là tình huống hiếm gặp. Hơn nữa, họ chỉ có thể xóa con trỏ, không phải đối tượng. Hoặc chúng ta có thể giả định rằng GraphicsEngine sẽ xóa các đối tượng, vật lýEngine chỉ trỏ đến chúng.
Cách nào tốt hơn?
Cái nào sẽ tạo ra nhiều vấn đề hơn trong tương lai?
Tôi thích giải pháp thứ hai hơn, nhưng tôi tự hỏi tại sao hầu hết các công cụ đồ họa và vật lý lại thích giải pháp thứ nhất (có thể vì chúng thường chỉ tạo ra đồ họa hoặc chỉ có công cụ vật lý và ai đó kết nối chúng trong trò chơi?).
Họ có thêm ưu & ẩn nào không?