'마녀:귀찮아!' DevLog 05
최적화 (라고 쓰고 갈통짓 찾기)
내가 만든 커스텀 에디터의 특정 기능이 수상할 정도로 오래걸렸다. 체감 상 한 1초 정도 걸리는 듯..
그동안 그려려니 하고 방치했었는데, 커스텀 에디터 이것저것 정리하고 하다보니 여간 신경쓰이는게 아니다.
커스텀 에디터 정리하는 김에, 이 1초가 대체 어디서 나오는 건지 찾아봤다.
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
public void UpdateGrid()
{
Debug.Log($"{nameof(UpdateGrid)}");
grid.Clear();
InitDic(CurType);
Dictionary<int, DataSO> dataSOs = DataSOs[CurType];
DataSOSlots.Clear();
for (int id = 0; id < ID_MAX; id++)
{
if (dataSOs.TryGetValue(id, out DataSO dataSO))
{
MDataSOSlot slot = new((slot) => SelectDataSOSlot(slot));
slot.SetDataSO(dataSO);
DataSOSlots.Add(id, slot);
grid.Add(slot.VisualElement);
}
}
SelectDataSOSlot(DataSOSlots.Values.First());
Repaint();
// Debug.Log($"{nameof(UpdateGrid)} End");
}
이곳저곳 로그 찍어보니 문제의 1초가 시작되는 곳은 이 함수.
커스텀 에디터에서 특정 그리드의 요소들을 다시 그려내는 함수이다. 인벤토리 같은 걸 다시 그려낸다고 생각하면 비슷하다.
처음 대충 훝어봤을 땐 코드에 이상한 점을 못 찾아서 (이걸 왜 찾았지),
System.Diagnostics.Stopwatch
를 통해 각 명령들이 얼마나 걸리는지 체크해보려고 했다.
흠.. InitDic(CurType)
부분이 문제인가? 파일 탐색이라 조금 걸릴 수도 있을 것 같긴해..
아니면 그리드 요소들 다 지우고 다시 추가하는 부분? 오브젝트 풀 없이 생으로 만들고 지워서 가비지가 한 번에 쫙 쌓여버리는건가..?
각 명령들 사이사이에 StopWatch
넣고 로그를 찍어봤다.
그런데 오잉… 각 명령들에는 0~10ms 걸리지 않는 것이다.
반복문을 감싸는 StopWatch
만 500ms 정도가 걸리는데.. 뭐지?
하고 다시 반복문을 보니, 아뿔싸. 이게 대체 무슨 코드지?
100_000_000 으로 설정해둔 ID_MAX
만큼 반복문을 돌고, 그 안에서는 딕셔너리에 TryGetValue
..?
그냥 딕셔너리 순회하면 되는거 아닌가?
그렇다.
그냥 언젠가 갈통짓을 하고 잊어버린 것이다.
이렇게 바로 보이는 문제를 그동안 방치하고 있었던 것이다 !!
1
2
3
4
5
6
7
8
DataSOSlots.Clear();
foreach ((int id, DataSO dataSO) in dataSOs)
{
MDataSOSlot slot = new((slot) => SelectDataSOSlot(slot));
slot.SetDataSO(dataSO);
DataSOSlots.Add(id, slot);
grid.Add(slot.VisualElement);
}
반복문 부분 수정하고 다시 로그 찍어보니, 역시 0~10ms 정도 걸린다.
이것도.. 최적화라고 할 수 있는건가?
아니다.. 이건 디버깅이라고 볼 수 있겠다..