TLDR: Bằng cách làm cho thành phần bao gồm nhiều mắt lưới để bắt đầu.
Tôi đồng ý với Asakeron / Byte56 / Laurent rằng cần có một mức độ gián tiếp khác giữa các cặp lưới / vật liệu và chính thực thể. Thay vì xem GraphicsComponent là các đỉnh và vật liệu, hãy nghĩ về nó như một đốm pixel trên raster cuối cùng - làm thế nào nó / chúng có được một chi tiết triển khai và không có gì nữa.
Tôi đã nghĩ về điều này rất nhiều cho dự án của mình và tôi nghĩ giải pháp tối ưu là biến GraphicsComponent thành một thành phần cấp cao hơn nhiều, bao gồm nhiều chức năng của đối tượng 'Model' truyền thống - bởi vì chức năng này không phải là tùy chọn! Để hiển thị các đa giác đó nhiều hơn chỉ là dữ liệu bộ đệm và trình đổ bóng là cần thiết, chẳng hạn như:
- Vị trí mà bạn đã đề cập
- Dữ liệu skinning / Animation
- Pass hiện tại (ví dụ: nếu sử dụng hai pass alpha)
- Thông tin đúc bóng (nếu bạn đang làm nó)
- Thông tin về cách thức và thời điểm cập nhật tài liệu
- Chức năng Culling
Và đó chỉ là tài sản 3D, không xem xét các hệ thống hạt, bảng quảng cáo, v.v. Nhưng tất cả chúng chỉ phù hợp với mã đồ họa / kết xuất - nó không ảnh hưởng đến vật lý, âm thanh hoặc kịch bản, vì vậy nó có ý nghĩa thành phần Đồ họa / Kết xuất.
Tôi đã kết thúc với:
Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore //This is the 'game object' - it is passed to the GraphicsController
ModelComponent : GraphicsComponent //This is the actual graphics component, used by the GraphicsController in the context of the game object.
ModelComponentPart : GraphicsComponent //This is also a graphics component
Mesh //These are implementation details
Material
ModelComponentPart : GraphicsComponent
Mesh
Material
Skeleton
Animations
Trong này:
Mô hình là bất kỳ tài sản trò chơi nào có thành phần đồ họa.
ModelComponent tương tự như Model truyền thống và trên thực tế, là dành cho các tài sản 3D. Bộ điều khiển GraphicsComponent (nếu bạn sử dụng mẫu Model-View-Controller) chịu trách nhiệm tìm ra loại tài sản đồ họa đó và vẽ chính xác (lưu ý rằng ModelComponent là một lớp con của GraphicsComponent).
Ngoài ra còn có một số thỏa hiệp trong tôi vì đơn giản và tính tương thích ngược, chẳng hạn như mỗi GraphicsComponent cũng là một Thực thể và Entity lưu trữ dữ liệu Vị trí trực tiếp để nó chỉ được tính ở một nơi, nhưng ý tưởng là như nhau: GraphicsComponent xử lý những gì cần thiết để vẽ vật phẩm - tất cả những gì cần thiết - không chỉ những gì đến từ người điều hành.