Tôi thường đọc trong các tài liệu công cụ trò chơi ECS là một kiến trúc tốt để sử dụng bộ đệm cpu một cách khôn ngoan.
Nhưng tôi không thể hiểu làm thế nào chúng ta có thể hưởng lợi từ bộ đệm cpu.
Nếu các thành phần được lưu trong một mảng (hoặc một nhóm), trong bộ nhớ liền kề, đó là cách tốt để sử dụng bộ đệm cpu NHƯNG chỉ khi chúng ta đọc các thành phần một cách tuần tự.
Khi chúng ta sử dụng các hệ thống, chúng cần danh sách các thực thể là danh sách các thực thể có các thành phần với các loại cụ thể.
Nhưng các danh sách này cung cấp cho các thành phần một cách ngẫu nhiên, không tuần tự.
Vậy làm thế nào để thiết kế một ECS để tối đa hóa bộ nhớ cache?
BIÊN TẬP :
Ví dụ, một hệ thống Physic cần một danh sách thực thể cho thực thể có các thành phần RigidBody và Transform (Có một nhóm cho RigidBody và một nhóm cho các thành phần Transform).
Vì vậy, vòng lặp của nó để cập nhật các thực thể sẽ như thế này:
for (Entity eid in entitiesList) {
// Get rigid body component
RigidBody *rigidBody = entityManager.getComponentFromEntity<RigidBody>(eid);
// Get transform component
Transform *transform = entityManager.getComponentFromEntity<Transform>(eid);
// Do something with rigid body and transform component
}
Vấn đề là thành phần RigidBody của thực thể1 có thể nằm ở chỉ số 2 của nhóm và thành phần Tranform của thực thể 1 tại chỉ số 0 của nhóm (vì một số thực thể có thể có một số thành phần chứ không phải là thành phần khác và vì thêm / xóa thực thể / thành phần ngẫu nhiên).
Vì vậy, ngay cả khi các thành phần tiếp giáp trong bộ nhớ, chúng được đọc ngẫu nhiên và do đó nó sẽ bị mất bộ nhớ cache nhiều hơn, phải không?
Trừ khi có một cách để tìm nạp trước các thành phần tiếp theo trong vòng lặp?