У вас нет своего блога? Можете легко его завести и начать писать свои великолепные статьи!
NewsBot
Новостной Бот запостил в Железо 1 месяц назад
11

Как работает оптимизация игр — объясняет Ярослав Кравцов






Не так давно в официальном твиттере CD Project Red было опубликовано обращение соучредителя CDPR Марчина Ивински к игрокам, где он рассказывает, «что происходило в дни перед запуском Cyberpunk 2077», и где называет технологию стриминга одной из основных проблем Cyberpunk 2077.

Ответить на обращение крупной статьёй вызвался Ярослав Кравцов, левелдизайнер Allods Team:


Объясняя ситуацию вокруг Cyberpunk 2077 Марчин Ивиньский рассказывает, что ключевая проблема в системе стриминга. Хороший повод поговорить про оптимизацию производительности в играх. Как сделать игру, чтобы и топовая картинка, и запускалось на калькуляторе.


Также на своей странице Twitter Ярослав продолжает рассказ, вот полная версия:


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

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

И где-то ближе к релизу выясняется, что игра клевая, но только у 5% потенциальной аудитории есть компы, которые потянут игру во всем великолепии. А у остальных игра будет с низким fps, долго загружаться и вообще хорошо если запустится. Мне «повезло» побывать на таком проекте. Пришлось рушить всю красоту и превращать картинку в месиво, чтобы пролезть в минимальные технические требования.

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

Что может входить в требования на мин. конфиге:
— Работа в определенном разрешении экрана
— Средний FPS 30 и выше
— FPS не опускается ниже 20
— Нет фризов
— Норматив на время загрузки (ну, чтоб не 5 минут)
— Чтобы всё влезло в оперативную память и видеопамять
— Размер билда

Проще сделать проект для мин. конфига и навернуть сверху красоты для железа помощнее, чем ужать толстый красивый проект под слабое железо. Здоровенный мир GTA V был заточен под работу на PS3/Xbox360 и это помогло игре на старте.

Ещё в 2007 году я занимался разработкой мобильных игр и там сначала делали игру для топового телефона, чтобы издатель был доволен, а потом страдали, запихивая обрезки игры в телефоны попроще. С тех пор потребности в красивых картинках для маркетинга меньше не стало.

Ладно, ближе к делу. Суть открытых миров в том, что они здоровенные и перемещение по ним без экранов загрузки. При этом нельзя весь игровой мир загрузить один раз в память — не влезет и время загрузки будет невозможно долгим. Поэтому используется технология стриминга (streaming). Это когда загрузка игры идет постоянно. Игрок движется по миру и вокруг него постоянно загружаются новые объекты впереди и выгружаются объекты позади. Таким образом, имея ограничения по памяти, можно шататься по огромному детализированному миру. Есть только нюанс. У стриминга есть предельная скорость, с которой может происходить подгрузка так, чтобы игрок её не замечал (т.е. без фризов). Если игрок слишком быстро перемещается по миру, то стриминг может не успевать справляться с подгрузкой.

В первую очередь, скорость стриминга зависит от харда. Консоли нового поколения как раз топят за то, что у них супер-быстрый стриминг. Новый Ratchet&Clank как раз демонстрирует как ловко может подгружать на лету целые миры. Опытные игроки знают, что надо ставить игры на SSD-диск или на плашку NVMe. Но это дороже, чем купить обычный HDD (жесткий диск) сразу на пару терабайт. Ведь игры сейчас большие, места всем много надо. И как итог — игры долго загружаются, а затем не справляются со стримингом.

Вот и Cyberpunk 2077 на некоторых системах не справлялся со своевременной подгрузкой текстур, анимаций, объектов игровой логики и прочим. При этом, наверняка, система стриминга пипец какая сложная, чтобы определять что в каком приоритете грузить. Например, NPC, которые стоят как декорация-массовка и не участвуют в геймплее, имеют приоритет ниже и поэтому их чаще можно застать в Т-позе (не прогрузилась анимация). Это мое предположение, как там под капотом я не знаю.

Вспомнил тут, что это отдельная боль для остальной разработки, так как обращаясь к любому ресурсу нужно проверять загрузился ли он. То есть нельзя просто дать команду «открыть ту дверь», так как дверь может в это время отсутствовать в памяти игры. Сам столкнулся с этим, делая игры под Roblox. Там ещё веселей, так как стриминг идет не с жесткого диска, а с сервера игры. Но про клиент-серверное взаимодействие поговорим как-нибудь потом. Там тоже много сюрпризов, которым не учат на курсах по геймдизайну.

Ещё одна боль — это как контролировать оптимизацию в игре, чтобы результаты тестов сейчас и неделю назад можно было сравнить. Для этого нужны тесты с воспроизводимой средой, максимально приближенной к игровым условиям. В идеале, если это воспроизводимая запись прохождения игры.

LOD (level of details) — ключевой инструмент борьбы за производительность. Суть его проста: чем меньше объект занимает места в кадре, то есть находится дальше от игрока, тем ниже его детализация (меньше полигонов, текстуры меньшего разрешения).

Источники света, от которых отбрасываются тени в реальном времени — это тоже популярный пожиратель производительности. Поэтому часто используют безтеневые источники света или вообще запекают освещение, то есть заранее просчитывают тени от статичных объектов.

Код тоже нужно оптимизировать. Если что-то можно считать раз в секунду, то не нужно делать это раз в кадр. Если вычисления сложные, то растянуть их на несколько кадров. Понимать какие операции являются «дорогими» и стараться их обойти. Это тема отдельной лекции.

Draw Call — дорогая процедура отрисовки объекта на видеокарте. Для этого есть трюки, например, batching — отрисовывать несколько объектов как один. Для этого нужно, чтобы объекты пользовались общим материалом/текстурой. Лучше грузить одну большую текстуру, чем гонять много мелких.

Culling — убирать из процесса рендера те объекты, которые находятся вне видимости игрока. Но аккуратно, чтобы, например, оставалась тень от объекта, который не в кадре. Сюда же относится отключение мелких объектов, если они очень далеко.

В системе террейна Unity с давних пор есть две подсистемы: травы и деревьев. Потому что объектов травы вокруг игрока может быть крайне много, но с расстоянием она может исчезать. А вот деревья большие, должны быть видны издалека, им просто так исчезать нельзя. Система террейна в том числе нужна для правильной оптимизации. Представьте, что у вас террейн 1×1 км, а шаг сетки 1 метр. Это значит модель террена состоит из 1млн квадратов, каждый из которых это треугольника (полигона). Это дофига 2млн полигонов на голом террейне.

Странно писать об этом в конце треда, а не в начале. Этот тред рассчитан на новичков, которые ещё не сталкивались с болью оптимизации. Понятное дело, что сюда легко могут набежать крутые программисты, потрясти RenderDoc'ом и разгромить меня в пух и прах. Что, кстати, хорошая идея.

Напомню, что в требования по оптимизации может входить ещё и размер билда. Часто вижу как инди-разработчики накачают себе ассетов (особенно мегасканов), а потом у них билд весит десятки гигабайт. Просто потому что не почистили билд от мусора. Ай-яй-яй.

На этом тренд закончу. Желаю, чтобы в ваших играх всё работало шустро и вам не приходилось идти на жертвы во время разработки. И чтобы как игроки вы лучше понимали с чем сталкиваются разработчики.




Ярослав не закончил на этом тред и продолжил с практичными примерами, статистикой железа игроков Steam, скорингом и прочим, и продолжает тему фризов и оптимизации, а также отвечает на вопросы комментирующих. Приводить продолжение не буду — читайте в твиттере самого Ярослава, пишет очень интересно :)


Источник: https://www.playground.ru/cyberpunk_2077/news/k...

0 комментариев
Оставлять комментарии имеют право только авторизованные пользователи...
    Комментариев еще нет...
    Последние комментарии
    • Спасибо.

    • Хорошо

    • Было бы круто, если бы фотки загружали в текст статьи, а не ссылки на них ставили. Ведь такая возможность же есть.

    • Надеюсь…

    • интересно, а сериал возобънавят молюсь каждый день