나는 어떻게 GTA Online 게임 로딩시간을 70% 줄였는가
(nee.lv)병목현상을 일으키는 아주 간단한 2개의 함수를 수정해서 6분 걸리던 GTA Online 로딩시간을 1분 50초대로 줄였다고 합니다.
공식 패치는 아니고 글쓴이가 dll 후킹으로 문제되는 2개 함수만 고쳐 실험한 결과네요. 2013년 말 출시때부터 지금까지 GTA Online 에서만 1조원이 넘는 수익을 올린 락스타게임즈가 이 간단한 문제를 해결을 안하고 있었다니 좀 너무했다 싶네요.
아래에 병목현상 내용들을 간단히 요약해봤습니다. 원글에 성능 측정, 문제 파악, 해결 방법(코드) 까지 재미있고 상세히 쓰여 있으니 꼭 읽어보세요.
1. Json parsing with sscanf
- 게임 코드는 무려 10MB 짜리 아이템 카탈로그 json 파일을 파싱하는데 각 항목(무려 약 63000개)마다 sscanf 함수가 호출했고,
sscanf 함수가 호출하는 strlen 함수는 문자열의 길이를 구하기 위해 파일 맨 끝까지 한글자씩 읽었다.
- 10MB 문자열을 연달아 63000번 읽느라 1분 30초를 더 쓰고 있었다.
2. Hash key not used
- 위의 내용에 바로 이어, 파싱했던 아이템 정보를 배열에 넣을 때 "배열 시작 위치부터" 순차 탐색을 통해 값을 삽입할 위치를 찾고 있었다.
- 저장 내용이 중복되는지 확인하기 위해 해시값을 쓰고 있는데도 해시맵을 사용하지 않아 삽입 위치를 찾는데만 "(63000^2+63000)/2" 번의 확인 과정을 거치느라 1분 40초를 더 쓰고 있었다.