Trong triển khai ECS của tôi, tôi sử dụng các thao tác bit-khôn ngoan (như được mô tả và minh họa trong luồng này ) để cho một thực thể biết loại thành phần nào hiện tại bao gồm. Vì vậy, Entity
lớp học của tôi có thành viên sau đây:
unsigned long m_CompMask;
Các loại thành phần khác nhau sau đó được định nghĩa là một enum
, có giá trị thành viên là tất cả sức mạnh của hai:
enum ComponentType
{
COMP_TYPE_UNKNOWN = 0,
COMP_TYPE_PERSON = 1,
COMP_TYPE_RENDERABLE = 2,
COMP_TYPE_MOVEABLE = 4,
[...]
};
Mỗi lần một thành phần mới được thêm vào thể hiện thực thể của tôi, tôi thực hiện thao tác bit sau để cập nhật mặt nạ (trong đó newType là thành viên của các enum
đề cập ở trên):
m_CompMask |= newType;
Cách tiếp cận này cho phép tôi kiểm tra hiệu quả nếu một thực thể nhất định có một thành phần nhất định (và do đó có thể phù hợp với một hệ thống cụ thể), như vậy:
return (m_CompMask & type);
Tuy nhiên, yếu tố giới hạn trong cách tiếp cận này là m_CompMask
biến vì nó sẽ không thể xử lý hơn 64 loại thành phần (nếu tôi tăng nó lên unsigned long long
).
Tôi không hy vọng sẽ cần nhiều hơn thế trong dự án hiện tại của mình, nhưng dù sao tôi cũng muốn nghe một số ý tưởng về các lựa chọn thay thế cho phép hơn 64 loại (như các trò chơi lớn chắc chắn cần) trong khi vẫn duy trì sự dễ dàng và hiệu quả của những hoạt động khôn ngoan nhất có thể? Bất kỳ ý tưởng làm thế nào điều này được xử lý trong các dự án "lớn thích hợp" ?