Tôi cứ chạm vấn đề này khi xây dựng game engine nơi lớp học của tôi muốn giống như thế này:OO kiến trúc cho rendering trong các trò chơi dựa shader
interface Entity {
draw();
}
class World {
draw() {
for (e in entities)
e.draw();
}
}
Đó chỉ là giả mã để hiển thị khoảng cách vẽ xảy ra. Mỗi lớp con thực thể thực hiện bản vẽ của riêng nó. Thế giới vòng qua tất cả các thực thể không theo thứ tự cụ thể và yêu cầu họ tự vẽ từng cái một.
Nhưng với đồ họa dựa trên bóng đổ, điều này có xu hướng cực kỳ kém hiệu quả hoặc thậm chí không khả thi. Mỗi loại thực thể có lẽ sẽ có chương trình đổ bóng riêng. Để giảm thiểu thay đổi chương trình, tất cả các thực thể của từng loại cụ thể cần phải được vẽ cùng nhau. Các loại thực thể đơn giản, như các hạt, cũng có thể muốn tổng hợp bản vẽ của chúng theo những cách khác, như chia sẻ một mảng đỉnh lớn. Và nó thực sự là lông với pha trộn và như vậy, nơi một số loại thực thể cần phải được trả lại tại những thời điểm nhất định liên quan đến những người khác, hoặc thậm chí nhiều lần cho các đường chuyền khác nhau.
Điều tôi thường kết thúc là một số loại trình kết xuất đồ họa cho mỗi lớp thực thể giữ một danh sách tất cả các phiên bản và rút tất cả chúng cùng một lúc. Điều đó không quá tệ vì nó tách bản vẽ khỏi logic trò chơi. Nhưng trình kết xuất cần tìm ra tập hợp con của các thực thể cần vẽ và nó cần truy cập vào nhiều phần khác nhau của đường ống đồ họa. Đây là nơi mà mô hình đối tượng của tôi có xu hướng lộn xộn, với nhiều mã trùng lặp, khớp nối chặt chẽ và những thứ xấu khác.
Vì vậy, câu hỏi của tôi là: kiến trúc tốt cho loại bản vẽ trò chơi nào hiệu quả, linh hoạt và mô-đun?
Thực tế là bạn đang tách nó khỏi mọi thứ khác là tốt để bắt đầu với, và nó có vẻ như lộn xộn của nó bởi vì ... của nó ... _messy_. ** Cần thiết ** lộn xộn là không may, nhưng vẫn còn cần thiết. Nhưng tôi nghi ngờ bạn sẽ xem đây là một câu trả lời… –