group-telegram.com/korovany/903
Last Update:
Сегодня все пишут про то, как какой-то парень ускорил загрузки в GTA Online на 70% с помощью DLL-инъекций. Весь патч занимает чуть больше ста строк на Си, а основным виновником долгих загрузок стал парсинг 10-мегабайтного JSON-файла.
В комментариях как всегда начали размышлять, почему Rockstar не починили это раньше, если все так просто. На самом деле, вопрос вполне себе релевантный, но...
Наверное любой, кто играл в GTA V в онлайне, замечал сверхдолгие загрузки. Сомневаюсь, что Rockstar были не в курсе проблемы. И, скорее всего, официальный фикс на деле окажется не таким простым, как может казаться со стороны. Все-таки этот патч — больше хак, чем решение проблемы. Но другого от человека, у которого нет доступ к исходникам, ожидать и не надо.
Посмотрим на первый из двух хаков — кеширование длинных строчек. Он тут самый безобидный и к нему меньше всего вопросов. Rockstar решили использовать sscanf для последовательного чтения всего JSON-файла, а большинство имплементаций функции вызывают во время работы strlen.
В общем для тех, кто не знаком с Си и C++ объясню просто: это очень неуклюжий и наивный способ парсинга с высокой алгоритмической сложностью (наверное, что-то около квадратичной, что для парсера вообще неприемлемо), крайне быстро становящийся медленным на больших файлах.
Автор решил кешировать указатели на начало и конец длинных строк, сокращая количество вызовов strlen. Для закешированной строки способ узнать ее размер будет заключаться в простой арифметике с указателями, где сначала мы проверяем, не выходим ли мы за границы строки, а потом просто вычитаем из конца текущую позицию. Worst-case scenario тут останется прежним (вызов strlen), но медиана станет намного быстрее.
Второй хак намного проще. При парсинге JSON (а в нем, судя по всему, содержится информация о всех предметах, которые можно купить за игровые деньги) и добавлении информации о новом предмете в структуру данных зачем-то проверяется уникальность добавляемого предмета. Автор выяснил (надеюсь на это), что дубликатов в JSON быть не может, и просто скипнул проверку, вставляя новые элементы в массив без нее. Безопасно ли это — большой вопрос. Почему проверка была там в первую очередь, если позиции должны быть уникальными?
Короче, основная проблема дискуссии вокруг таких фиксов в том, что мы судим не с позиции разработчиков, которые знают намного больше нас о своей игре. Мы не знаем, кто писал этот код, почему он писал его так, и действительно ли эти изменения безопасные. Может это ломает какие-то внутриигровые штуки, а может быть и нет, и это просто разработчики такие криворучки (или, что более вероятно, задача не в приоритете).
Лишь в одном я со многими комментаторами соглашусь. Оставлять в игре проблему долгих загрузок не решенной на протяжении многих лет — крайне неуважительно по отношению к игрокам. Представим, что при должной оптимизации они могли бы сократить загрузки если не на 70%, то хотя бы на 50%. А это уже 3 минуты выигрыша для каждого игрока каждый раз, когда он запускает игру.
В общем, ждем официального иска ответа Rockstar, если он вообще будет. Вдруг что-то да починят.
BY Геймдев, который мы заслужили

Share with your friend now:
group-telegram.com/korovany/903