| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- C
- (주)책만
- 이득우
- 메타버스
- The Elements of Computing Systems 2/E
- 생능출판
- Noam Nisan
- booksr.co.kr
- 알고리즘
- C++
- 게임 수학
- 전공자를 위한 C언어 프로그래밍
- Shimon Schocken
- 백준
- 데이터 통신과 컴퓨터 네트워크
- hanbit.co.kr
- 일기
- unity6
- JavaScript
- BOJ
- 잡생각 정리글
- 주우석
- C#
- 입출력과 사칙연산
- 밑바닥부터 만드는 컴퓨팅 시스템 2판
- 박기현
- 이득우의 게임수학
- 김진홍 옮김
- HANBIT Academy
- https://insightbook.co.kr/
- Today
- Total
cyphen156
C# Array of Generic Dictionary에 대한 고찰 본문
맨 처음 자료구조를 선택할때 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개쯤 되려나...?
근데도 구분하는건 로드 & 해제가 번들단위로 연속해서 같은유형끼리 몰려서 입력/해제되기 때문
'프로그래밍 > C#' 카테고리의 다른 글
| 파일 정합성 인증 - 무결성 검사 정책 정하기 (0) | 2026.01.10 |
|---|---|
| C# 어드레서블 카탈로그 따라하기 – 어드레서블에 ContentManifest 끼얹기 (0) | 2025.12.23 |
| C# 병렬성과 비동기 Async와 Await에 대한 고찰 (0) | 2025.10.09 |
| C# 문자열 변수 할당 최적화 (0) | 2025.04.01 |
| C# 반복자 패턴 IEnumerator과 yield키워드 (0) | 2025.02.25 |
