ボトルネックを引き起こしていた非常に単純な2つの関数を修正し、6分かかっていたGTA Onlineの読み込み時間を1分50秒台まで短縮したそうです。
公式パッチではなく、筆者がDLLフックで問題のある2つの関数だけを修正して実験した結果とのことです。2013年末の発売時から今に至るまで、GTA Onlineだけで1兆ウォンを超える収益を上げてきたロックスター・ゲームスが、この単純な問題を解決していなかったとは、さすがにひどいと思わされます。
以下にボトルネックの内容を簡単に要約しました。原文には性能測定、問題の特定、解決方法(コード)まで面白く詳しく書かれているので、ぜひ読んでみてください。
- Json parsing with sscanf
- ゲームコードは、なんと10MBものアイテムカタログJSONファイルをパースする際、各項目(約63,000件もある)ごとに
sscanf関数を呼び出しており、
sscanf 関数が呼び出す strlen 関数は、文字列の長さを求めるためにファイルの末尾まで1文字ずつ読み進めていました。
- 10MBの文字列を63,000回連続で読み込むせいで、さらに1分30秒を費やしていました。
- Hash key not used
-
上の内容に続いて、パースしたアイテム情報を配列に入れる際、「配列の先頭位置から」順次探索して値を挿入する位置を探していました。
-
保存内容が重複しているか確認するためにハッシュ値は使っているのに、ハッシュマップを使っていなかったため、挿入位置を探すだけで
("63000^2+63000")/2回の確認処理を経ることになり、さらに1分40秒を費やしていました。
まだコメントはありません。