포스트

'마녀:귀찮아!' DevLog 05

'마녀:귀찮아!' 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 정도 걸린다.

이것도.. 최적화라고 할 수 있는건가?
아니다.. 이건 디버깅이라고 볼 수 있겠다..

To Be Continued..

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.