ECS 라는게 난 그렇게 거창한게 아니라고 생각하는 사람이라서 그럴 수도 있음.
결국 캐시 공간지역성을 극도로 사용하기 위한 자료구조라고 난 생각함.
그리고 자료구조다 보니 ECS의 환경이 아니라도 사용할 수 있는 당연한 개념이라 생각함.
예로들어, ECS 하면 많이 언급되는 자료구조 중 하나가 SparseSet 이잖아.
근데 SparseSet 을 보면 그냥 Dictionary 임.
Key를 주면 Value를 뱉는 자료구조.
대신 Dictionary는 메모리가 여러 곳에 파편화되기 때문에 성능 이슈가 있을 수 있는데
SparseSet은 이 성능 이슈를 없애기 위한 컨셉을 추가한 Dictionary 이지.
컨셉은 간단함.
2개의 배열 Sparse, Dense 를 사용하는데,
Sparse 에는 실제 데이터가 어디에 있는지가 담겨져 있고,
Dense 에는 실제 데이터가 담겨져 있음.
Key가 들어오면 해당 Key를 인덱스로 Sparse 배열에 접근하고, 그 배열의 값이 실제 데이터의 Dense Index 를 얻을 수 있음
그리고 그 Dense Index로 Dense 배열에 접근해서 실제 데이터를 가져올 수 있지.
Key가 추가 될 때 Dense 배열에 연속적으로 저장되고, 삭제될 때도 삭제되는 원소와 맨 뒤의 원소를 서로 Swap 하는 방식으로 하기 때문에
Dictionary와 마찬가지로 조회 삭제 추가가 O(1) 복잡도로 처리 된다는거고,
가장 중요한건 실제 데이터(Dense)가 배열이다 보니깐 이터레이션 돌리면 캐쉬 히트율이 붐 하는거지.
거기다가 루프 의존성이 없다 ? 바로 Job 때려버리면 한번 더 가속.
그냥 이새끼는 자료구조임.
성능이 중요하면 언제든지 써야 함.
다들 맛점하고
맞는데 유니티에 통합하려 할떄 그기괴함과 정작 홍보해놓고 애니매이션 사용불가 때문에 욕먹는거
해당 댓글은 삭제되었습니다.
근데 궁금한게 ECS같은 데이터기반 개발에서 유니티보다 나은 게임엔진이 단 하나라도 있음? 유니티가 좋다는게 아니라 진짜 못봐서그럼
오브젝트들을 그 sparse set으로 전환하고 거기에서 돌리는 것까지가 Sparse Set임. 핵심 개념만 보면 당연히 쉽지. 그리고 ECS할 때 Sparse Set을 많이 언급하나? 유니티는 Archetype을 쓰는데.
그냥 SparceSet은 어려운게 없이 동일 타입들이 비슷한 메모리에 존재하는 것뿐임. 그게 단일 객체면 sparceset인거고, 그게 객체 단위 묶음이면 유니티의 Archetype이 되는거고