CPU 캐시를 현명하게 사용하기에 적합한 아키텍처 인 ECS 게임 엔진 설명서를 자주 읽습니다.
그러나 CPU 캐시의 이점을 어떻게 얻을 수 있는지 알 수 없습니다.
구성 요소가 연속 메모리에 배열 (또는 풀)로 저장된 경우 구성 요소를 순차적으로 읽는 경우에만 CPU 캐시 BUT을 사용하는 것이 좋습니다.
시스템을 사용할 때 특정 유형의 구성 요소가있는 엔티티 목록 인 엔티티 목록이 필요합니다.
그러나 이러한 목록은 구성 요소를 순차적이 아닌 임의의 방식으로 제공합니다.
그렇다면 캐시 적중을 극대화하기 위해 ECS를 설계하는 방법은 무엇입니까?
편집하다 :
예를 들어, Physic 시스템에는 RigidBody 및 Transform 구성 요소가있는 엔터티에 대한 엔터티 목록이 필요합니다 (RigidBody 용 풀 및 Transform 구성 요소 풀이 있음).
따라서 엔터티를 업데이트하는 루프는 다음과 같습니다.
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
}
문제는 entity1의 RigidBody 구성 요소가 풀의 인덱스 2에 있고 pool의 인덱스 0에 entity1의 Tranform 구성 요소가 될 수 있다는 것입니다. / 구성 요소를 무작위로).
따라서 구성 요소가 메모리에서 연속적 일지라도 무작위로 읽히므로 더 많은 캐시 미스가 발생합니다.
루프에서 다음 컴포넌트를 프리 페치하는 방법이 없다면?