Открыть список
Как стать автором
Обновить

Комментарии 49

Извинияюсь за глупый вопрос, сам не играл, но я правильно понял, проблеса с загрузками есть с 2013 года, и никто не догадался (кроме автора поста) попрофайлить её?
Из статьи следует, что по мере наполнения внутриигрового магазина и роста кол-ва ассортимента, росло и время загрузки. И на данный момент размер конфига достиг до 10МБ (ассортимент магазина до 63к элементов), что с неверно выбранным способом парсинга привело к отложенным проблемам, хотя кол-во и небольшое.
Проблемы с долгой загрузкой онлайна были с самого старта, особенно страдали консольщики. Как обычно что то пофиксили, что то сломали.

типичная проблема алгоритмов O(n^2): начальные данные слишком маленькие, чтобы обнаружить проблему на старте, через какое-то время объем данных вырастает, чтобы все начало тормозить, и не очень понятно из-за чего: "раньше работало же".

Онлайн же так долго грузится, потому что ищет свободную совместимую сессию, сюжетка загружается довольно быстро, не мгновенно, конечно, но приемлемо. А вот в онлайн вечером можно и 15 минут заходить
Онлайн грузится долго даже в закрытую сессию только для друзей или одиночную сессию. С релиза играю, знаю.
Подтверждаю, онлайн всегда грузился оооочень долго, в т. ч. сейчас с последними патчами и дополнениями. Комп у меня немного побыстрее авторского.

Очень классная статья, спасибо за перевод! Не думал, что так просто (относительно) можно исправлять такие вещи без перекомпилирования/патчинга бинарника.

Посмотрел исходники glibc (не знаю насколько свежие) — всё именно так и есть: https://code.woboq.org/userspace/glibc/libio/strops.c.html#41


Не совсем strlen, но тоже последовательное сканирование строки в поисках завершающего нулевого символа.


Если кому интересно зачем так сделано — там поленились писать отдельную ветку для разбора нуль-терминированной строки, и вместо этого превращают переданную строку в буфер для как-бы-файла (FILE*). На этом этапе и требуется размер строки.


Избежать квадратичного алгоритма можно было бы или передав размер строки в аналог sscanf, или явно открыв строку как файл и используя fscanf. Вот только стандартная библиотека не даёт сделать ни того, ни другого...

Но ведь sscanf для нуль-терминированных строк — очень широко применяемый юз-кейс, можно было и оптимизировать эту ветку.

Подозреваю, что чаще всего sscanf используют, чтобы разобрать строку полностью. А здесь им много раз читали по одному числу.


Я был бы все-таки за то, чтобы иметь какой-нибудь snscanf, который бы читал не больше n символов.

вот так ремонт игрушки выльется в изменение стандарта с/с++…

Вообще они могли бы использовать какой-нибудь готовый проверенный сообществом JSON-парсер, а не велосипедить свой. JSON на 10 Мб, в общем-то, не что-то сверхъестественное.

Это странно. Но я регулярно вижу какие-то велосипедные json парсеры в крупных игровых проектах.
Чуть ли не копипасты примитивных парсеров со stackoverflow. Ощущение, что просто условный мидл которого попросили прикрутить фичу, не хочет связываться со сложными либами и берет самую простую из инета, которую может найти.
Это не исключение. Прям стабильно натыкаюсь на такое.
Возможно либы сложно согласовывать, там лицензии всякие, вопросы с их поддержкой. А велосипед вот он, готов ехать!
После такого RG обязаны позвать его в штат.
Вы плохо знаете RG и их хозяев TakeTwo. Повезет если не подадут в суд и не пришлют частных детективов выпытывать откуда он узнал такую сверхсекретную информацию.
Надо попросить автора оригинала сделать то же самое для Killing Floor 2.

А там загрузки по сколько минут занимают?

Там очень долгий, на несколько минут, запуск самой игры, особенно если не с SSD. Причём с другими играми на UE3 такого нет. Благо загрузки уровней в самой игре потом довольно быстрые.
KF2 на UE3 сделан? Тогда не удивлён долгим загрузкам. Напхали туда новых технологий мама не горюй

Еще в онлайн режиме она дико тормозит на пс4 ( не про )

Вот будет смешно, если они так и не исправят всё равно.

Зачем? Игра отживает свое.

Нуу, такое. Онлайн и сейчас приносит килобаксы профита.
НЛО прилетело и опубликовало эту надпись здесь
Скажите это парням которые переписывали с реверсом ГТА 3 и попали под копирайтеров. 3ю ГТА, Карл, которая еще продается
как отживает? летом версия для ps5 выходит с новым контентом
Будет не смешно, а грустно.
Они ему уже 10к$ по bughounty заплатили. Так что исправят.
А есть ссылка? Всё, нашёл в оригинале. И в последнем апдейте даже написано, что уже и апдейт вышел с исправлением.
Да, одна из причин, по которой я забросил GTA Online — долгое время загрузки, причем не только при запуске GTA5.exe, но и при любом переходе из сессии в сессию, например при выполнении задания, по его окончании и выходе в свободную игру и т.п. При этом загрузка сессии может не состояться и меня выбросит в свободную игру… которая тоже, в свою очередь, не загрузится и принудительно загрузит оффлайн сюжетку. Нет желания тратить (суммарно) десятки минут просто на ожидание загрузки. Я догадывался, что проблема не на моей стороне, но думал, что причина в «бутылочном горлышке» где-то на полпути к серверам Rockstar. А оно вот как оказалось…

А что если использовать вместо json какой-то бинарный формат данных?

Ну да Вы что, тогда на собеседованиях вместо вопроса «Слышали ли вы о JSON?» надо будет спрашивать «Слышали ли вы о бинарных форматах данных?», это сузит круг соискателей и придётся предлагать им более высокие зарплаты.

В данном случае проблема не в JSON, а в зачем-то написанном самодельном неэффективном парсере, при том что готовых горы, в том числе под лицензиями, допускающими беспроблемное использование в закрытом софте.

JSON можно парсить со скоростью 3гбайта на ядро. Или за 3.5мс в данном случае, причём скорость чтения с современного ССД и парсинга будут +- сравнимыми, при желании можно хоть каждый фрейм перепарсивать, после перечитывания с диска без кеширования :)

со скоростью 3гбайта на ядро.
Это как ехать со скоростью 100 километров на машину?
Играю периодически, тоже бесит долгая (и негарантированная) загрузка онлайн. Поделюсь лайвхаками.
Есть простой способ «выгнать всех» из сессии: запускаем виндовый Монитор ресурсов, находим процесс GTA5, ПКМ — «Приостановить процесс», ждем когда когда в миганиях лапочки на LAN (я гляжу на свой роутер) возникнут перебои (или просто считаем до 10) — «Возобновить процесс», вуаля, все вышли, ты один в сессии (для остальных в сессии это ты вышел).
Подобным способом ускоряю загрузку в сессию: при загрузке игры наблюдаю за индикатором LAN, как начался интенсивный сетевой обмен (идет «синхронизация» с сессией), замораживаю-размораживаю процесс GTA5 и попадаю в пустую сессию.

Но парсинг JSON это не ускорит.

Жесть.
У меня на php сотнимегабайтные XML(1c)/YML/Excel от поставщиков на десятки тысяч товаров парсятся не более чем за 10 секунд, через практически ручной построчный разбор, используя XMLReader, вместе с групповой вставкой в базу (которая ещё ведёт лог изменений через триггеры).

Какие нафиг 1м50с (и тем более 6мин) на парсинг 10мб? Тем более на С.

Все просто, у вас O(n) алгоритм, а в GTA — внезапный O(n^2). Ну не думал разработчик, что sscanf будет по всей строке пробегаться каждый раз. А со вторым примером — кого-то явно не спрашивали на собеседовании про хеш таблицы.

Дело ведь не в том, что спрашивали, а чего нет. Все допускают ошибки и пишут порой неоптимизированный код, удивляет только то, что никто этого не заметил и не пофиксил

Её просто никто не пытался решить — это вопрос к менеджменту. Проблему долгой загрузки знает кто угодно, кто играл в GTA5 Online, причём таких загрузок, бывает, проходит по нескольку штук (т.е. в сумме 10 и более минут ожидания может накопиться), пока компанией пытаешься соединиться на одном сервере. Эти ожидание отбивают всякое желание играть в онлайн в компании, только если случайно зайти куда то, что тоже не всегда интересно.
Со вторым примером кто-то предусмотрел вероятность дубликата хеша. Правда не учёл, что данные никогда не дублируются.

На самом деле, для разных данных хэш в общем-то имеет право совпадать. Но тем не менее, стандартные хэш-таблицы позволяют искать дубликаты за почти константное время (для этого правда надо иметь хорошую хэш-функцию, но ведь взять готовую тоже вполне можно)

Ну вот, правильная обработка коллизий — это основа хэш таблицы. Если тупо пробегать по ней всей каждый раз, то смысл вообще хэши считать? Просто разработчик не знал про такую структуру данных и нагородил что-то свое. А ревью у них или нет, или оно попало к такому же.

Спасибо за статью. Читалось как детектив. А убийца как обычно дворецкий.


Но если честно, после таких статей становится непонятно почему самолёты падают так редко...

Когда начали менять и дополнять то, что диды писали — так и повалились один за другим.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Информация

Дата основания
Местоположение
Россия
Сайт
www.itsumma.ru
Численность
101–200 человек
Дата регистрации

Блог на Хабре