관리 메뉴

cyphen156

C# Array of Generic Dictionary에 대한 고찰 본문

프로그래밍/C#

C# Array of Generic Dictionary에 대한 고찰

cyphen156 2026. 1. 27. 14:18

맨 처음 자료구조를 선택할때 Uint Key, Type Asset의 유형으로 딕셔너리 자료구조를 선택햇다.
Key가 순차적으로 들어온다는 보장이 없고, 동일한 애셋 유형끼리 관리하기 위해 당연한 것이엇다.
근데 이 애셋 유형별 딕셔너리를 스위치로 분기하자니 딕셔너리가 늘어날때마다 함수가 늘거나, 스위치 분기가 늘어나는게 귀찮았다. 
그래서 딕셔너리의 포인터 배열로 관리하면 빠른 접근이 가능하지 않을까? 햇다.

그래서 나온것이 
Dictionary<Domian, object >[] domains라는 딕셔너리의 배열이다. 

근데 이렇게하면 타입 안정성이 object 유형이라 뭐든 죄다 캐스팅해버린다. 

Dictionary가 object 를 상속받는 자료구조이기 때문에 사용가능하긴 한데 쓰는 입장에서 Dictionary가 아니라 ArrayList, HashMap등등 온갖것을 죄다 타입캐스팅해서 사용하려 할 수 있다는 점이 문제였다. 

게다가 내가 생각햇던 지역성 이득은 본질적으로 애셋을 로드하는 구조에서 무의미해진다. 물론 딕셔너리자체에 대한 순차접근 지역성은 여전히 존재한다. 

하지만 실제 애셋을 로드하여 개별 딕셔너리에 적재하는 동안 어차피 딕셔너리 포인터를 통해 힙에 접근해서 해당 애셋 유형에 대한 캐시라인으로 메모리에 읽어오고 나면 다음 딕셔너리에 대해 접근하기 위해 딕셔너리 배열의 지역성이 깨진다.

그래서 그럴바엔 그냥 배열 형태를 포기하고 
타입안정성을 강화하자는 쪽으로 결론지었다. 
최종적으로 선택된 자료는 다음이다
Dictionary<Type, object> TypeMaps

여기에 TypeMaps[Type] = Dictionary<uint, T>가 될 것이다.

 

이제 애셋 호출자는 GetSprite, GetGameObject, GetUserDate 전부 안한다 그냥
T asset = GetAsset<T>(15789);
이 한줄로 원하는 유형의 자료형을 획득하려 시도한다.


참고로 이 자료구조 결정하는데만 5일걸렷슴다....

한달째 리팩토링만 하는데 코드변화가 없으니 멘탈 쪼개지네요

※ 여담 

사실 단일 딕셔너리에 박아도 문제 안생김 16진수 20비트 체계라서 끽해야 100만개고 
내가 만드는 게임에서 그렇게 많이 쓰지도않음 많아야 20개쯤 되려나...?
근데도 구분하는건 로드 & 해제가 번들단위로 연속해서 같은유형끼리 몰려서 입력/해제되기 때문