Опыт портирования на Switch: приёмы и необходимые жертвы
Когда оптимизацией приходится заниматься в одиночку.
The Forbidden Arts — это экшен-платформер про головоломки и магию, выпущенный инди-студией Stingbot Games. Игра вышла 7 августа на Nintendo Switch, Xbox One и ПК.
Владелец студии Стерлинг Селовер в своём блоге на Gamasutra опубликовал историю о том, как он в одиночку пытался добиться 60 кадров в секунду на Switch — чтобы игра не уступала в производительности версиям на других платформах. Мы выбрали из рассказа главное.
Большую часть портирования Селовер проделал самостоятельно — на протяжении четырёх месяцев работы. Как отметил разработчик в блоге, у его студии не было тех ресурсов, которыми располагали крупные компании вроде Bethesda или EA, потому пришлось экспериментировать. За плечами у Селовера уже был опыт оптимизации проектов на телефонах.
Как известно, в Switch функционирует мобильный графический чип Tegra X1, который значительно слабее аналогов в «старших» консолях. Так, The Forbidden Arts на Xbox One X работает в 4К и 60 FPS, в то время как на консоли от Nintendo максимальное разрешение, которого можно добиться — 1080р в стационарном режиме.
В итоге у Селовера получилось достичь 1080р в док-станции и 720р — в портативе. Впрочем, в The Forbidden Arts функционирует динамическое разрешение: в некоторых сценах оно опускается до 900р и 540р соответственно.
Сначала в качестве эксперимента разработчик запустил на девките версию от Xbox — и ожидаемо получил 13 FPS при 720р в портативном режиме, с просадками до 8 FPS. В итоге первой целью стала цифра хотя бы в 30 кадров в секунду.
Как выяснилось, основная нагрузка шла на графический чип — в то время как процессор использовался лишь на 50 процентов. В The Forbidden Arts работала куча графических эффектов: сглаживание, динамическое освещение, тени высокого разрешения, постобработка и много шейдеров, неоптимизированных для Switch.
Первым делом Селовер отключил сглаживание — и сразу же получил прирост в 10 кадров. Следом под нож пошли шейдеры: их пришлось заменить на упрощённые аналоги. Постобработка приближала внешний вид игры к «старшим» версиям, поэтому её разработчик пока решил не трогать. Итого — в среднем 32 кадра.
Многие другие студии, которые когда-либо занимались портом для Switch, остановились бы на этой цифре — однако Селовер понял, что при таком фреймрейте The Forbidden Arts неиграбельна. В определённых локациях платформер требует от игрока реакции, и любая задержка была непозволительна. Игра должна была работать при 60 кадрах в секунду, как и на других платформах.
Разработчик занялся тенями. Первоначально они были мягкими и работали в реальном времени в самом высоком разрешении. В итоге, после снижения на среднее, а затем и низкое качество теней производительность вновь показала прирост — на этот раз до 41-43 кадров.
Затем пришлось оптимизировать постобработку. Селовер слегка переделал стандартный эффект размытия, который предлагал движок Unity, и отключил Ambient Occlusion («фоновое затенение»). Однако из-за этого цветовая палитра стала более блеклой — из-за чего над некоторыми текстурами и эффектами разработчик поработал вручную.
Осталось разобраться с частными случаями — отдельными ассетами и локациями. На первом уровне игры, Korrath Woods, были две вещи, которые сильно влияли на производительность — трава и деревья. Трава использовала самописный шейдер для того, чтобы она двигалась — от него пришлось отказаться.
Также Селовер порекомендовал создавать с нуля новые ассеты — с меньшей детализацией и не такими «прожорливыми» шейдерами. Однако у разработчика не хватало времени и средств, чтобы заняться этим вплотную — поэтому он использовал старый метод оптимизации.
Некоторые деревья вдалеке, которые всегда повёрнуты к игроку под одним углом, он заменил на плоские текстуры. При этом в самих изображениях сохранялась иллюзия того, что к дереву применены все спецэффекты — включая размытие и цветокоррекцию. Конечно, так пропадает анимация — однако на Switch и с оригинальными моделями, которые стоят вдали, не скажешь, что объекты как-то движутся.
К тому же, Селовер заменил некоторые шейдеры воды, сделал редизайн некоторых локаций, где было слишком много геометрии, а также оптимизировал эффекты частиц. Всего, по его словам, на порт ушло несколько сотен часов работы.
Последнее, с чем оставалось разобраться — это со временем загрузки. Самая «объёмная» локация, Overworld, на Switch загружалась 36 секунд, что для платформера слишком много. Пришлось сжать все большие текстуры, которым такое качество «не особо-то и нужно» — от некоторых частиц до скайбоксов.
Однако этого было недостаточно: большую часть производительности «съедали» аудиофайлы. Чтобы этого избежать, Селовер слегка переписал код специально для этой локации: так звуки стали храниться напрямую в файлах уровня, а вся нагрузка пошла на процессор. С 36 секунд время загрузки упало до 11-ти. Остальные сцены подгружались и того меньше.
Подводя итоги, разработчик отметил, что для Switch нужно найти свой подход — принципы мобильного портирования здесь не совсем уместны. Однако на некоторые жертвы придётся пойти в любом случае.