목록자료구조/자료구조 설계 (4)
개발하는 리프터 꽃게맨입니다.
GameObjectManager (가칭)전체 순회, 삽입, 삭제, 탐색 속도가 매우 빠른 컨테이너입니다.제목은 GameObjectManager 라고 지었는데, GameObject를 관리하기 위한 컨테이너 쯤으로 불러도 괜찮습니다.이름에서 볼 수 있듯 게임 오브젝트를 관리하기 위해서 만든 특별한 자료구조입니다.게임에서 가장 빈번히 일어나는 작업 중 하나는 컨터이너의 순회입니다. 보통 게임 오브젝트들은 매 틱마다 자신의 고유의 일을 수행하기 위해 Update 혹은 Tick 이라는 함수를 수행합니다. 그러기 위해서는 컨테이너에 수많은 오브젝트들을 저장하여 전체 순회를 통해서 상태를 갱신하는 설게를 사용할 수 있습니다. 그러므로 컨테이너의 순회는 1초에 최소 60번은 발생하며, 순회의 속도는 게임의 성능을 판가..
1. 오브젝트는 이중으로 관리 1) 빠른 삽입, 삭제, 탐색을 위한 해쉬 테이블 2) 빠른 순회를 위한 오브젝트 벡터, 빠른 삭제를 위해 특수한 형태의 벡터를 사용함 2. 해쉬 테이블 키 : 오브젝트의 ID (ID는 uint64 이며 유일하다.) 값 : std::pair (배열의 인덱스, 오브젝트의 unique_ptr) 3. 벡터 단순한 일자형 벡터 캐쉬 히트가 높아서 순회속도가 빠르다. 4. 탐색 해쉬 테이블을 통한 탐색 5. 삽입 해쉬 테이블을 통한 삽입 -> O(1) 배열에 추가적으로 삽입하고 배열의 인덱스를 해쉬 테이블에 업데이트 -> O(1) 이 때 push_back을 사용하면 안됨 벡터의 맨 뒤 인덱스를 얻어냄 해당 인덱스의 요소가 nullptr면 대입 해당 인덱스의 요소가 nullptr가 아..
#pragma oncenamespace MC{ template class Queue { public: Queue() : m_head(0), m_tail(0), m_count(0), m_capacity(1), m_data(1) {} void Push(T&& value) { if (m_count == m_capacity) { Reallocate(CapacityLogic()); } m_data[m_tail] = std::move(value); m_tail = (m_tail + 1) % m_capacity; m..
template class Iterator { public: Iterator(T* item) : _item(item) {} public: T* operator++() { return ++_item; } T* operator--() { return --_item; } T* operator+(int idx) { return _item + idx; } T* operator-(int idx) { return _item - idx; } int& operator*() { return *_item; } int& operator->() { return *_item; } bool operator==(const Iterator& other) const { return _item == other._item; } bool o..