13P by dynalloc 2021-03-01 | favorite | 댓글과 토론

병목현상을 일으키는 아주 간단한 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초를 더 쓰고 있었다.