Как ускорить загрузку гта 5
GTA Online. Многопользовательская игра, печально известная медленной загрузкой. Недавно я вернулся, чтобы завершить несколько ограблений — и был потрясён, что она загружается настолько же медленно, как и в день своего выпуска, 7 лет назад.
Пришло время докопаться до сути.
Проблема №2: давайте используем хэш-… массив?
Оказалось, что второй виновник вызывается непосредственно рядом с первым. Они оба даже вызываются в одном операторе if , как можно понять в этой уродливой декомпиляции:
Обе проблемы находятся внутри одного большого цикла парсинга всех предметов. Проблема №1 — парсинг, проблема №2 — сохранение.
Все метки указаны мной, я понятия не имею, как по-настоящему называются функции и параметры.
В чём же заключается вторая проблема? Сразу после парсинга предмета он сохраняется в массив (или во встроенный список C++? не совсем понятно). Каждый предмет выглядит примерно так:
Но что происходит перед сохранением? Код проверяет весь массив, один элемент за другим, сравнивая хэш предмета, чтобы понять, находится ли он в списке. Если мои вычисления верны, то при примерно 63 тысячах элементов это даёт (n^2+n)/2 = (63000^2+63000)/2 = 1984531500 проверок. Большинство из них бесполезно. У нас есть уникальные хэши, так почему бы не использовать hash map?
Профилировщик показывает, что процессор нагружают первые две строки. Оператор if выполняется только в самом конце. Предпоследняя строка вставляет предмет.
В процессе обратной разработки я назвал эту структуру hashmap , однако очевидно, что это not_a_hashmap . И дальше всё становится только лучше. Этот хэш/массив/список перед загрузкой JSON пуст. И все предметы в JSON уникальны! Коду даже не нужно проверять, есть ли предмет в списке! Есть даже функция для непосредственной вставки предметов, достаточно просто использовать её! Серьёзно, чё за фигня!?
Обновить драйвера видеокарты, скачать драйвера для GTA 5
Вне зависимости от того, какая видеокарта стоит в системном блоке, ее драйвера нужно поддерживать в актуальном состоянии. Поэтому перед запуском GTA V следует зайти на сайт производителя и проверить, не вышли ли новые драйвера:
После установки драйвера следует перезагрузить компьютер, чтобы исключить возможность сбоев. Также стоит учитывать, что для многих старых видеокарт новые драйверы уже не выходят.
Для некоторых игр производители видеокарт выпускают специально оптимизированные драйвера. Поищите таковые в разделе новостей о GTA V - обычно мы про них пишем. Также можно посмотреть на сайте производителей видеокарт.
Разведка
Сначала я хотел проверить, вдруг кто-то уже решил проблему. Но нашёл только рассказы о великой сложности игры, из-за чего она так долго загружается, истории о том, что сетевая p2p-архитектура — мусор (хотя это не так), некоторые сложные способы загрузки в сюжетный режим, а потом в одиночную сессию, и ещё пару модов, чтобы скипнуть видео с логотипом R* во время загрузки. Ещё немного почитав форумы, я узнал, что можно сэкономить колоссальные 10-30 секунд, если использовать все эти способы вместе!
Тем временем на моём компе…
Бенчмарк
Время загрузки сюжетного режима: около 1 мин 10 с
Время загрузки онлайн-режима: около 6 мин 0 с
Меню запуска отключено, время от появления логотипа R* до начала самого игрового процесса (время логина в social club не считается).
Старый, но приличный ЦП: AMD FX-8350
Дешёвый SSD: KINGSTON SA400S37120G
Без оперативки не обойтись: 2 модуля Kingston 8192 МБ (DDR3-1337) 99U5471
Относительно неплохой GPU: NVIDIA GeForce GTX 1070
Понимаю, что моя машина устарела, но какого чёрта онлайн-режим загружается в шесть раз медленнее? Я не смог обнаружить никаких отличий при использовании техники загрузки «сначала сюжет, потом онлайн», как это удалось сделать другим до меня. Но даже бы если это сработало, то результаты находились бы в рамках погрешности.
Включить режим производительности Nvidia
После установки драйвера для видеокарты от компании Nvidia можно ускорить работу GTA 5 с помощью режима производительности. Это немного упростит графику в игре, но повысит FPS. Обратите внимание, что этот метод доступен только в случае, если у вас видеокарта с чипом от Nvidia. Вот как это сделать:
- В нижнем правом углу экрана, в трее, нажать правой кнопкой мыши на иконку «Настройки NVIDIA»;
- В открывшемся окне справа выбрать вкладку «Параметры 3D»;
- Нажать на опцию «Регулировка настроек изображения с просмотром»;
- Справа поставить флажок напротив «Пользовательские настройки с упором на:»;
- Передвинуть «ползунок», который находится ниже, в крайнюю левую позицию «Производительность»;
- Снизу нажать на кнопку «Применить».
Далее необходимо запустить GTA V и убедиться, что все отображается корректно. Если возникают проблемы, то нужно вместо «Пользовательские настройки с упором на:» выбрать «Настройки согласно 3D-приложению».
Бенчмарк
Знаю, что моё железо устарело, но чёрт возьми, что может замедлить загрузку в 6 раз в онлайн-режиме? Я не мог измерить разницу при загрузке из сюжетного режима в онлайн, как это делали другие. Даже если это сработает, разница небольшая.
Отключить оверлеи
Речь идет о тех программах, которые способны отображать свой интерфейс поверх игры. Часто на компьютере есть такие — Fraps, Steam, Origin и так далее. Даже когда оверлей скрыт, он обрабатывается компьютером, снижая FPS в GTA V.
Поэтому все оверлеи нужно отключить. Почти всегда это можно сделать в настройках программы без необходимости ее удаления. Например, оверлей Steam, легко отключается через меню:
Результаты
Ну и как, сработало?
Исходное время загрузки онлайн-режима: примерно 6 мин
Время только с пропатченными дублируемыми проверками: 4 мин 30 с
Время только с патчем парсера JSON: 2 мин 50 с
Время с патчами обеих проблем: 1 мин 50 с
(6*60 — (1*60+50)) / (6*60) = время загрузки уменьшилось на 69.4% (отлично!)
О да, ещё как сработало!
Скорее всего, это не уменьшит время загрузки у всех игроков — на других системах могут быть другие «узкие места», но это настолько очевидная проблема, что я не понимаю, как R* не замечала её все эти годы.
- При запуске GTA Online есть узкое место ЦП из-за однопотокового выполнения
- Оказывается, в это время GTA сражается с парсингом 10-мегабайтного файла JSON
- Сам парсер JSON плохо написан/наивно реализован и
- После парсинга выполняется медленная процедура проверки отсутствия дубликатов предметов
Я (не) одинок
Если доверять этому опросу, проблема достаточно широко распространена, чтобы слегка раздражать более 80% игроков. Прошло уже семь лет!
Я немного поискал информацию о тех
20% счастливчиках, которые загружаются быстрее трёх минут, и нашёл несколько бенчмарков с топовыми игровыми ПК и временем загрузки онлайн-режима около двух минут. Я бы кого-нибудь убил хакнул за такой комп! Действительно похоже на железячную проблему, но что-то не складывается…
Почему у них сюжетный режим по-прежнему загружается около минуты? (кстати, при загрузке с M.2 NVMe не учитывались видео с логотипами). Кроме того, загрузка из сюжетного режима в онлайн занимает у них всего минуту, в то время как у меня около пяти. Я знаю, что их железо гораздо лучше, но не в пять же раз.
Высокоточные измерения
Вооружившись таким мощным инструментом, как Диспетчер задач, я приступил к поиску узкого места.
Почти минута уходит на загрузку общих ресурсов, которые нужны и для сюжетного режима, и для онлайна (почти наравне с топовыми ПК), затем GTA в течение четырёх минут полностью нагружает одно ядро CPU, больше ничего не делая.
Использование диска? Нет! Использование сети? Есть немного, но через несколько секунд падает в основном до нуля (кроме загрузки вращающихся информационных баннеров). Использование GPU? Ноль. Память? Вообще ничего…
Что это, майнинг биткоинов или что-то такое? Чую здесь код. Очень плохой код.
Единственный поток
На моём старом процессоре AMD восемь ядер, и он ещё молодцом, но это старая модель. Его сделали ещё тогда, когда производительность одного потока у AMD была намного ниже, чем у Intel. Наверное, это главная причина таких различий во времени загрузки.
Что странно, так это способ использования CPU. Я ожидал огромное количество операций чтения с диска или массу сетевых запросов, чтобы организовать сеансы в сети p2p. Но такое? Вероятно, здесь какая-то ошибка.
Профилирование
Профилировщик — отличный способ найти узкие места в CPU. Есть только одна проблема — большинство из них полагаются на инструментирование исходного кода, чтобы получить идеальную картину происходящего в процессе. А у меня нет исходного кода. Мне также не требуются идеальные показания в микросекундах, у меня узкое место на 4 минуты.
Итак, добро пожаловать в образцы стека (stack sampling). Для приложений с закрытым исходным кодом есть только такой вариант. Сбросьте стек запущенного процесса и местоположение указателя текущей инструкции, чтобы построить дерево вызовов в заданные интервалы. Затем наложите их — и получите статистику о том, что происходит. Я знаю только один профилировщик, который может проделать это под Windows. И он не обновлялся уже более десяти лет. Это Люк Stackwalker! Кто-нибудь, пожалуйста, подарите Люку немножко любви :)
Обычно Люк группировал бы одинаковые функции, но у меня нет отладочных символов, поэтому пришлось смотреть на соседние адреса, чтобы искать общие места. И что же мы видим? Не одно, а целых два узких места!
Увеличить файл подкачки, если не хватает оперативной памяти для GTA 5
Чтобы компенсировать недостаток оперативной памяти, можно увеличить файл подкачки. Это позволит системе хранить часть необходимых GTA V данных прямо на жестком диске. Вот что нужно сделать:
- Открыть «Проводник»;
- Правой кнопкой нажать на «Этот компьютер» (или «Мой компьютер»);
- В контекстном меню кликнуть на «Свойства»;
- В открывшемся окне слева нажать на «Дополнительные параметры системы»;
- В открывшемся окне перейти на вкладку «Дополнительно»;
- В разделе «Быстродействие» нажать на кнопку «Параметры. »;
- В открывшемся окне перейти на вкладку «Дополнительно»;
- Снять флажок с параметра «Автоматически выбирать объем файла подкачки» (если есть);
- Поставить флажок напротив опции «Указать размер»;
- В текстовых полях «Исходный размер (МБ):» и «Максимальный размер (МБ):» указать в мегабайтах значение, равное половине объема оперативной памяти.
Например, если в системном блоке установлена «плашка» на 4 Гб, то есть 4192 Мб, в поля выше нужно вписать число 2048. Можно сделать файл подкачки больше, но никакого прироста это не даст.
Вниз по кроличьей норе
Позаимствовав у моего друга совершенно законную копию стандартного дизассемблера (нет, я действительно не могу его себе позволить… когда-нибудь освою гидру), я пошёл разбирать GTA.
Выглядит совсем неправильно. Да, у большинства топовых игр есть встроенная защита от реверс-инжиниринга, чтобы защититься от пиратов, мошенников и моддеров. Не то чтобы это их когда-то останавливало…
Похоже, здесь применили какую-то обфускацию/шифрование, заменив большинство инструкций тарабарщиной. Не волнуйтесь, нужно просто сбросить память игры, пока она выполняет ту часть, на которую мы хотим посмотреть. Инструкции должны быть деобфусцированы перед запуском тем или иным способом. У меня рядом лежал Process Dump, так что я взял его, но есть много других инструментов для подобных задач.
3. Действия с роутером.
Убедитесь, что ваш роутер исправно работает и обновлен до последней версии прошивки. Попробуйте перезапустить его, выключив на 5 минут, а затем включив. Также рекомендую играть в GTA Online по проводному подключению.
Как разогнать видеокарту для GTA 5
Все, что связано с «разгоном», направлено на увеличение производительности, но это довольно обширные темы, о которых в двух словах рассказать сложно. К тому же это всегда довольно рисковое дело. Если что, мы вас предупредили.
Чтобы добиться большего значения FPS в GTA 5, сначала можно попробовать разогнать видеокарту. Самый простой способ сделать это — воспользоваться встроенными функциями ПО от производителя видеокарты.
Например, в комплекте с некоторыми видеокартами от GIGABYTE поставляется программа Graphics Engine, в которой есть несколько уже готовых профилей разгона. Это позволяет выжать из видеокарты 5-10 дополнительных кадров в секунду.
Если программы от производителя нет, то всегда можно воспользоваться универсальным решением — MSI Afterburner. Это одна из лучших программ для разгона, в ней множество разных настроек.
Но тут придется все настраивать вручную. Повышать следует в первую очередь частоту самого видеочипа («Core Clock») и частоту памяти видеокарты («Memory Clock»). Слева находятся базовые значения этих параметров. Справа отображаются температура и увеличение вольтажа — эти характеристики позволяют следить за «здоровьем» видеокарты.
При повышении частоты возрастает нагрев видеокарты. Если температура переходит отметку в 85 градусов, то следует увеличить скорость оборотов вентиляторов («Fan Speed»). Если температура повысилась до 100 градусов, то следует немедленно прекратить разгон, иначе чип может расплавиться. Мощный «разгон» требует водяного охлаждения, поэтому не следует повышать частоты более чем на 10%.
Разогнать процессор
В то время как «разгон» видеокарты вполне осуществим прямо в Windows, для того, чтобы улучшить работу процессора и тем самым увеличить быстродействие GTA V, придется лезть в «Биос».
Геймерский «разгон» процессора обычно предполагает увеличение процессорного множителя (Core Ratio). Сделать это можно далеко не на каждом процессоре, а только на том, где этот множитель разблокирован. Обычно такие процессоры помечаются особым образом. Например, компания Intel использует маркировки «K» и «X‘. То есть, например, i7-4790 нельзя разогнать с помощью множителя, а вот i7-4790K — вполне.
Но как узнать точное название модели процессора? Проще всего воспользоваться программой CPU-Z. Запустив ее, нужно открыть вкладку «CPU» и посмотреть на самую первую строчку — «Name». Это и есть название процессора. Кстати, там же можно увидеть из сам множитель. Он в разделе «Clocks», в строке «Multiplier». Если процессор поддерживает «разгон», то этот множитель можно изменить.
Чтобы изменить коэффициент Core Ratio, нужно сначала попасть в оболочку BIOS. Для этого нужно нажать особое сочетание клавиш во время загрузки компьютера (до того, как появится экран Windows).
Сочетание может различаться в зависимости от материнской платы. Часто BIOS можно вызвать с помощью клавиши «F8» или «Del». На экране «Биоса» нужно найти раздел, посвященный процессору. Тут тоже все сложно, так как оболочек у BIOS много. Практически каждый производитель материнский плат использует свою собственную, поэтому без знания английского языка найти нужное место не так-то просто.
Изменять множитель нужно постепенно, повышая его на 2. После каждого изменения следует перезапускать компьютер и тщательно проверять работоспособность и температуру процессора. Если она становится выше 80 градусов во время игры, то нужно немедленно выключить GTA 5, перезагрузить компьютер, зайти в BIOS и снизить значение Core Ratio. Иначе процессор может сгореть.
Вниз по кроличьей норе
Позаимствовав у друга совершенно законную копию популярного дизассемблера (нет, я не могу себе его позволить… придётся как-нибудь изучить ghidra), я приступил к разборке GTA.
Всё это кажется совсем неправильным. Многие высокобюджетные игры имеют встроенную защиту от реверс-инжиниринга, чтобы защититься от пиратов, читеров и моддеров (не сказать, чтобы это когда-то их останавливало).
Похоже, здесь используется некая обфускация/шифрование, из-за которого большинство команд заменено абракадаброй. Но не волнуйтесь, нам просто нужно сдампить память игры в момент выполнения части, которую мы хотим изучить. Перед своим выполнением команды тем или иным способом должны деобфусцироваться. У меня был под рукой Process Dump, но есть множество других инструментов, способных выполнять подобные функции.
Проблема 1: это что… strlen?!
Дальнейший разбор дампа выявил один из адресов с некоей меткой strlen , которая откуда-то берётся! Спускаясь вниз по стеку вызовов, предыдущий адрес помечен как vscan_fn , и после этого метки заканчиваются, хотя я вполне уверен, что это sscanf .
Он что-то парсит. Но что? Логический разбор займёт целую вечность, поэтому я решил сбросить некоторые образцы из запущенного процесса с помощью x64dbg. Через несколько шагов отладки выясняется, что это… JSON! Он парсит JSON. Колоссальные десять мегабайт JSON'а с записями 63 тыс. предметов.
Что это? Судя по некоторым ссылкам, это данные для «сетевого торгового каталога». Предполагаю, он содержит список всех возможных предметов и обновлений, которые вы можете купить в GTA Online.
Проясним некоторую путаницу: я полагаю, что это предметы, приобретаемые за игровые деньги, не связанные напрямую с микротранзакциями.
10 мегабайт? В принципе, не так уж и много. Хотя sscanf используется не самым оптимальным образом, но, конечно, это не так уж плохо? Что ж…
Да, такая процедура займёт некоторое время… Честно говоря, я понятия не имел, что большинство реализаций sscanf вызывают strlen , поэтому не могу винить разработчика, который написал это. Я бы предположил, что он просто сканировал байт за байтом и мог остановиться на NULL .
Проблема 2: давайте использовать хэш-…массив?
Оказывается, второго преступника вызывают сразу за первым. Даже в одной и той же конструкции if , как видно из этой уродливой декомпиляции:
Все метки мои, и я понятия не имею, как на самом деле называются функции/параметры.
Вторая проблема? Сразу после разбора элемента он хранится в массиве (или встроенном списке C++? не уверен). Каждая запись выглядит примерно так:
А перед сохранением? Он проверяет весь массив, сравнивая хэш каждого элемента, есть он в списке или нет. С 63 тыс. записей это примерно (n^2+n)/2 = (63000^2+63000)/2 = 1984531500 , если я не ошибаюсь в расчётах. И это в основном бесполезные проверки. У вас есть уникальные хэши, почему не использовать хэш-таблицу.
Во время реверс-инжиниринга я назвал его hashmap , но это явно не_hashmap . И дальше ещё интереснее. Этот хэш-массив-список пуст перед загрузкой JSON. И все элементы в JSON уникальны! Им даже не нужно проверять, есть они в списке или нет! У них даже есть функция прямой вставки элементов! Просто используйте её! Серьёзно, ну ребята, что за фигня!?
Ограничение одним потоком
Хотя мой старый ЦП AMD имеет восемь ядер и всё ещё может себя показать, он был создан в старые времена. Тогда однопоточная производительность процессоров AMD намного отставала от показателей процессоров Intel. Возможно, это и не объясняет всю разницу во времени загрузки, но должно объяснить самое главное.
Странно то, что игра использует только ЦП. Я ожидал огромного объёма загружаемых с диска ресурсов или кучу сетевых запросов для создания сессии в сети p2p. Но это? Скорее всего, это баг.
Еще больше ухудшить графику в GTA 5 (режим «картошки») - выключить сглаживание и т.п.
Если GTA V запускается, но сильно тормозит, то перед началом всех процедур следует снизить графику до минимума через настройки игры. Если это не помогло, то придется прибегнуть к помощи сторонних программ для настройки видеокарты:
Загрузив программу, запускаем ее. В случае с NVIDIA Inspector нужно запускать файл nvidiaProfileInspector.exe, а не nvidiaInspector.exe. Сверху, в строке «Profiles:» можно выбрать любую игру, которая поддерживается драйверами Nvidia.
Ниже представлены все доступные настройки. Их много, но для того, чтобы ухудшить графику в игре до «картофельной», вполне достаточно всего нескольких, которые находятся в разделе «Antialiasing».
Наибольший прирост производительности дает изменение этих двух параметров:
- Texture filtering — LOD bias;
- Antialiasing — Transparency Supersampling.
Каждая из этих настроек имеет разные значения. Некоторые из них могут делать картинку в GTA V неудобоваримой, поэтому следует попробовать разные комбинации значений, которые дают более-менее сносное играбельную картинку.
В случае с RadeonMod все аналогично: нужно найти настройки, отвечающие за отображение текстур и снижать их до тех пор, пока FPS в игре не станет достаточно высоким.
Отключить ненужные программы
Каждая программа, которая запущена в ОС, занимает определенный процент оперативной памяти и загружает процессор. Убедиться в этом легко, достаточно просто открыть диспетчер задач с помощью сочетания клавиш Ctrl+Alt+Del:
Доказательство концепции
Всё это конечно классно, но никто не воспримет меня всерьёз, пока я не напишу реальный код для ускорения загрузки, чтобы сделать кликбейтный заголовок для поста.
План такой. 1. Написать .dll, 2. внедрить её в GTA, 3. зацепить некоторые функции, 4. . 5. профит. Всё предельно просто.
Проблема с JSON нетривиальная, я не могу реально заменить их парсер. Более реалистичным кажется заменить sscanf на тот, который не зависит от strlen. Но есть ещё более простой способ.
- зацепить strlen
- подождать длинной строки
- «закэшировать» начало и длину
- если поступит ещё вызов в пределах диапазона строки, вернуть закэшированное значение
А что касается проблемы хэш-массива, то здесь просто полностью пропускаем все проверки и вставляем элементы напрямую, поскольку мы знаем, что значения уникальны.
Полный исходный код PoC здесь.
Отключить эффекты Windows
Если GTA V работает не в полноэкранном режиме, а в окне, в том числе и без рамки, то повысить FPS можно, если отключить эффекты Windows. Для этого нужно проделать следующие действия:
- Открыть «Проводник»;
- Правой кнопкой нажать на «Этот компьютер» (или «Мой компьютер»);
- В контекстном меню кликнуть на «Свойства»;
- В открывшемся окне слева нажать на «Дополнительные параметры системы»;
- В открывшемся окне перейти на вкладку «Дополнительно»;
- В разделе «Быстродействие» нажать на кнопку «Параметры. »;
- В открывшемся окне перейти на вкладку «Визуальные эффекты»;
- Поставить флажок напротив опции «Обеспечить наилучшее быстродействие».
При необходимости на последнем шаге можно выбрать опцию «Особые эффекты». В таком случае можно самостоятельно выбрать, какие эффекты оставить, а какие — отключить.
Результаты
Ну и как оно работает?
Да, чёрт возьми, получилось! :))
Скорее всего, это не решит всех проблем с загрузкой — в разных системах могут быть и другие узкие места, но это такая зияющая дыра, что я понятия не имею, как R* пропустила её за все эти годы.
Профилирование
Профилировщики — отличный способ поиска «узких мест» в работе ЦП. Есть только одна проблема — большинство из них для получения идеальной картины происходящего в процессе использует исходный код. А у меня его нет. Но мне не нужны и показания с точностью до микросекунд — «узкое место» длится целых четыре минуты.
На сцене появляется сэмплирование стека: это единственный вариант изучения приложений с закрытыми исходниками. Выполняем дамп стека запущенного процесса и местоположения указателя текущей команды, чтобы строить дерево вызовов с заданными интервалами. Затем складываем их, чтобы получить статистику о происходящем. Есть только один известный мне профилировщик (здесь я могу ошибаться), способный на такое в Windows. И он не обновлялся больше десяти лет. Это Luke Stackwalker! Пусть кто-нибудь подарит этому проекту свою любовь.
Виновники №1 и №2.
Обычно Luke группирует одинаковые функции, но поскольку у меня нет отладочных символов, мне нужно глазами просматривать ближайшие адреса, чтобы понять, что это одно и то же место. И что же мы видим? Не одно, а целых два «узких места»!
Краткое содержание
- При запуске GTA Online есть узкое место, связанное с однопоточным вычислением
- Оказалось, GTA изо всех сил пытается распарсить 1-мегабайтный файл JSON
- Сам парсер JSON плохо сделан/наивен и
- После парсинга происходит медленная процедура удаления дублей
Очень точные измерения
Вооружённый такими мощными инструментами, как Диспетчер задач, я начал расследование, чтобы выяснить, какие ресурсы могут быть «узким местом».
В течение одной минуты загружаются стандартные ресурсы сюжетного режима, после чего игра в течение четырёх с лишним минут грузит процессор.
После минуты загрузки общих ресурсов, используемых и в сюжетном, и в онлайн-режимах (показатель, почти равный бенчмаркам мощных PC) GTA решает максимально нагружать одно ядро моей машины в течение четырёх минут и больше ничего не делать.
Обращение к диску? Его нет! Использование сети? Есть немного, но спустя всего несколько секунд трафик падает почти до нуля (кроме загрузки вращающихся баннеров с информацией). Использование GPU? По нулям. Использование памяти? Совершенно плоский график…
Что происходит, игра майнит крипту, или ещё чего? Начинает попахивать кодом. Очень плохим кодом.
Proof of Concept
Всё это конечно здорово, но никто не воспримет меня всерьёз, пока я это не протестирую, чтобы можно было написать к посту кликбейтный заголовок.
Каким будет план? Написать .dll , инъецировать её GTA, перехватить несколько функций, . ПРОФИТ!
Проблема с JSON запутанна, и замена парсера окажется чрезвычайно трудоёмкой задачей. Гораздо реалистичнее будет попытаться заменить sscanf на функцию, не зависящую от strlen . Но есть ещё более простой способ.
- перехватить strlen
- дождаться длинной строки
- «кэшировать» её начало и длину
- если она снова вызывается в пределах строки, возвращать кэшированное значение
Что касается проблемы хэш-массива, то с ней всё проще — можно просто полностью пропускать дублирующиеся проверки и вставлять предметы напрямую, потому что мы знаем, что значения уникальны.
Полные исходники proof of concept находятся здесь.
2. Переход на публичные DNS-сервера.
Как менять DNS-сервера я уже показывал в одном из видео. Этот процесс довольно легкий. Можете посмотреть мое видео , либо загуглить . Экспериментируйте с серверами, пробуйте подключиться, используя различные. Стоит понимать, что это может не помочь вам, однако вреда для вашего интернета эта операция не принесет, следовательно пробуйте!
Список некоторых известных DNS-серверов:
Сервера от Google :
- 8.8.8.8 в качестве предпочитаемого DNS-сервера.
- 8.8.4.4 в качестве вашего альтернативного DNS-сервера.
Сервера OpenDNS :
Сервера YandexDNS :
Остальные вы можете найти самостоятельно в интернете.
R*, пожалуйста, исправьте
Если информация каким-то образом дойдёт до инженеров Rockstar, то проблему можно решить в течение нескольких часов силами одного разработчика. Пожалуйста, ребята, сделайте что-нибудь с этим :<
Вы можете либо перейти на хэш-таблицу для удаления дублей, либо полностью пропустить дедупликацию при запуске как быстрое исправление. Для парсера JSON — просто замените библиотеку на более производительную. Не думаю, что есть более простой вариант.
R*, пожалуйста, решите проблему
Просьба, если эта статья каким-то образом доберётся до Rockstar: на решение этих проблем не уйдёт больше дня работы одного разработчика. Пожалуйста, сделайте с этим что-нибудь.
Можно перейти на hashmap для устранения дубликатов или полностью пропускать эту проверку, что будет реализовать быстрее. В парсере JSON замените библиотеку на более производительную. Не думаю, что здесь есть более простое решение.
Пробуем ускорить загрузку GTA Online.
Всем привет. Я знаю, что вы страдаете от долгой загрузки GTA Online (я тоже в числе этих "счастливцев").
Хочу сразу сказать, что конкретного и однозначного проверенного способа, который помог бы 100% ускорить загрузку игры как в сюжетку, так и в онлайн - НЕ СУЩЕСТВУЕТ!
Но зато существует несколько небольших и проверенных действий, которые многим помогли. О них я сегодня и расскажу.
- Примечание: главной проблемой в скорости загрузки игры скорее всего являетсясама играи ее архитектура . А также используемые протоколы подключения Rockstar Games. Возможно, дело также в том, что для своих онлайн-игр Rockstar используют некий гибрид из серверов и peer-to-peer.
Проблема №1: это… strlen?!
При дизассемблировании теперь уже менее обфусцированного дампа обнаруживается, что один из адресов имеет метку, взятую ниоткуда! Это strlen ? Следующий вниз по стеку вызовов помечен как vscan_fn , после чего метки заканчиваются, однако я практически уверен, что это sscanf .
Они что-то парсят. Но что? Разбор дизассемблированного кода занял бы бесконечность, поэтому я решил сдампить некоторые сэмплы из запущенного процесса при помощи x64dbg. Проведя пошаговую отладку, я выяснил, что это… JSON! Они парсят JSON. Целых 10 мегабайт данных JSON с почти 63 тысячами элементов.
Что это? Согласно некоторым источникам, это похоже на данные «каталога сетевого магазина». Предположу, что они содержат список всех возможных предметов и апгрейдов, которые можно купить в GTA Online.
Уточнение: я считаю, что это предметы, покупаемые за внутриигровые деньги, а не связанные напрямую с микротранзакциями.
Но 10 мегабайт — это ведь мелочь! А использование sscanf пусть и не оптимально, но не может же оно быть настолько плохим? Ну-у-у…
10 мегабайт строк C в памяти. 1. Перемещаем указатель на несколько байт к следующему значению. 2. Вызываем sscanf(p, "%d", . ) . 3. Считываем каждый символ в 10 мегабайтах при считывании каждого мелкого значения (!?). 4. Возвращаем отсканированное значение.
Да, это займёт много времени… Честно говоря, я понятия не имел, что большинство реализаций sscanf вызывает strlen , поэтому не могу винить написавшего это разработчика. Я бы предположил, что эти данные просто сканируются байт за байтом и обработка может остановиться на NULL .
Как я сократил время загрузки GTA Online на 70%
GTA Online печально известна своей медленной скоростью загрузки. Запустив недавно игру, чтобы выполнить новые миссии-налёты, я был шокирован тем, что она загружается так же медленно, как и в момент выпуска семь лет назад.
Время настало. Пора разобраться в причинах этого.
Разведка
Для начала я захотел проверить, не решил ли уже кто-нибудь эту проблему. Большинство найденных результатов состояло из анекдотичных данных о том, насколько сложна игра, что ей приходится грузиться так долго, историй об отстойности сетевой архитектуры p2p (и в этом есть правда), сложных способов загрузки в сюжетный режим, а после него в одиночную сессию и пары модов, позволявших пропустить начальное видео с логотипом компании R*. Некоторые источники сообщали, при совместном использовании всех этих способов можно сэкономить аж целых 10-30 секунд!
Тем временем на моём PC…
Я не одинок
Если поверить этому опросу, то проблема настолько распространена, что слегка подбешивает более 80% базы игроков. Ребята из R*, вообще-то уже семь лет прошло!
У 18,8% игроков мощнейшие компьютеры или консоли, у 81,2% всё довольно грустно, у 35,1% — совсем печально.
Поискав 20% тех счастливчиков, загрузка у которых занимает меньше трёх минут, я нашёл некоторое количество бенчмарков с мощными игровыми PC и временем загрузки онлайн-режима примерно две минуты. Чтобы получить время загрузки в две минуты я бы убил хакнул что угодно! Похоже, время загрузки зависит от «железа», но числа как-то не сходятся…
Как получилось, что людей, делавших эти бенчмарки, загрузка сюжетного режима всё равно занимает примерно минуту? (Кстати, в бенчмарке с M.2 не учтено время показа логотипов в начале.) Кроме того, загрузка из сюжетного в онлайн-режим занимает у них всего минуту, а у меня — больше пяти. Я знаю, что у них техника намного лучше моей, но точно не в пять раз.
Изменить параметры электропитания
По умолчанию в компьютере установлен сбалансированный режим электропитания, который, а в некоторых ноутбуках, в целях увеличения времени работы, и вовсе установлена экономия энергии.
Это не дает компьютеру раскрыть свой потенциал в GTA 5 полностью, поэтому первым делом нужно открыть панель управления, которую можно найти с помощью поиска. После нужно сделать следующее:
- Выбрать режим просмотра «Мелкие значки»;
- Кликнуть на «Электропитание»;
- На экране найти опцию «Настройка схемы электропитания», кликнуть на нее;
- Кликнуть на «Изменить дополнительные параметры питания»;
- В открывшемся окне найти выпадающий список;
- В списке выбрать «Высокая производительность»;
- Нажать кнопку «Применить», затем кликнуть «ОК».
GTA 5 → Оптимизация для слабых ПК
Прежде чем переходить к активным действиям нужно убедиться, что на компьютере есть хотя бы 10-15 Гб свободного места на жестком диске, на который установлена операционная система.
Обычно это диск «C». Этот минимальный запас необходим для того, чтобы система могла без каких-либо проблем создавать временные хранилища файлов GTA V, кэши и так далее.
Посмотрите системные требования GTA 5 и убедитесь, что на вашем жестком диске достаточно места для нормальной работы игры.
1. Открытие портов.
Начнем с самого сочного. Открытие портов процесс сложный для неподготовленного человека, но если посмотреть пару роликов на ютубе, то разобраться будет несложно. Надежнее всего открывать порты именно через интерфейс вашего роутера , а не через брандмауэр.
- Брандмауэр же вообще лучше полностью отключить и пользоваться каким-нибудь сторонним антивирусом.
Вы должны открыть следующие порты:
- 61458, 61456, 61457, 61455, 6672 (для протокола UDP).
- 80, 443 (для протокола TCP).
После открытия портов вы можете проверить их доступность на сайте 2ip.
После открытия портов перезагрузите ваш компьютер и заходите в GTA Online. Проверьте, насколько долгой загрузка будет в этот раз.
Читайте также: