Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Питер «Durante» Томан — автор множества модов для увеличения производительности ПК игр. Среди них известный фикс для Dark Souls «DSfix» и инструментарий для даунсэмплинга «GeDoSaDo». В этой статье он рассказывает о трудностях и особенностях переноса игры The Legend of Heroes: Trails of Cold Steel на ПК

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Когда XSEED связались со мной и предложили поучаствовать в портировании The Legend of Heroes: Trails of Cold Steel на ПК, я оказался в восторге от перспектив. Серия The Trails in the Sky была одной из моих любимых JRPG на ПК, поэтому я точно решил сделать одну из последних игр франшизы лучшей, насколько это возможно, на ПК.

Конечно, на тот момент я и представить не мог как сильно я буду вовлечён в это дело. Я ожидал сделать несколько оптимизаций тут и там, может быть потратить неделю-другую полную работы. В реальности оказалось всё совсем иначе.

Эта статья поделенана три части:

  • Первая часть расскажет о производительности, делая акцент на FPS и времени загрузки.
  • Во второй части будут графические настройки и улучшения, сделанные специально для ПК версии.
  • И, наконец, третья часть покажет особенности ПК версии, которые напрямую не попадают под пункт “графические улучшения”.

Часть 1: Производительность

Начало Истории

Мне кажется уместным для истории о программе начать с загрузки. И первой же проблемой, с которой я столкнулся, оказалось время загрузки. В версии игры для ПК, на текущем этапе, даже на самых производительных машинах загрузка занимала примерно 20 секунд. И это касалось не только редких загрузок больших уровней, но и даже загрузок при начале и завершении обычной битвы. К тому же, на протяжении всей игры были замечены значительные подгрузки.

Конечно же, это было недопустимо. После продолжительного анализа я понял, что основная причина для подгрузок и длительного времени загрузки была в Nvidia Cg (на данный момент уже устаревший и не обновляющийся язык высокого уровня для написания шейдеров), который использовал игровой движок для компилирования и загрузки шейдеров в среде выполнения. Используя кэширование и повторное использование результатов компиляции, мне удалось уменьшить время загрузки (после первоначальной загрузки) до ~2-3 секунд, и, также, устранить последующие подгрузки. Удовлетворенный прогрессом, я сообщил о своих находках и передал код.

Стандарты

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

Поскольку игра была изначально выпущена на PS3 и даже PS Vita (правда ПК версия использует ассеты уровня PS3 или лучше), ты ожидаешь, что на быстрой системе игра будет летать. Однако, к этому моменту я уже нашёл определенные сцены и положения камеры при которых производительность падала до 45 кадров в секунду (FPS), полностью ограниченная процессором. Используя разные инструменты профилирования я обнаружил что проблема напрямую связана с тем, как рендеринг OpenGL/Cg работает с состоянием шейдеров: делалось до десятков вызовов состояний на единичный вызов отрисовки. Проделав несколько очевидных настроек и оптимизаций я смог поднять производительность на моём тестовом стенде до 55 FPS. На этом этапе я прикинул, что полностью оптимизированный рендеринг Cg-версии игры в этой сцене сможет дать игре на моём ПК около 80 FPS в лучшем случае.

Этого будет недостаточно.

Я никогда бы не смог поставить своё имя рядом с портом игры, которая работала на PS3 в 30 FPS, и которая получила всего 80 FPS на моём ПК 2015 года. На самом деле, лично я хотел бы запустить игру на чём-то слабом и портативном, вроде GPD Win. А с таким уровнем производительности это было бы невозможно.

Меняем коней на переправе

Единственное правильное решение проблем с производительностью — это полностью заменить бэкенд рендеринга. У базового движка уже был бэкенд DX11, но в отличие от OpenGL/Cg он, очевидно, не использовался Falcom во время разработки Trails of Cold Steel. И игра, и её ассеты использовали большой набор функций, который был недоступен или работал не так в бэкенде DX11. Таким образом, переключение на другой рендерер было огромным изменением, по сравнению со всеми операциями по портированию на ПК, которые были сделаны до этого момента.

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

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

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

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Результат

Несмотря на проблемы и усилия, вложенные в портирование совершенно другого бэкенда рендеринга, всё в итоге окупилось. График ниже даёт представление о производительности (CPU) игры на моём ПК во время разных стадий разработки:

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Текущее состояние игры, помеченное как “Оптимизированная DX11 версия” ("Optimized DX11 version"), в большей степени соответствует тому, что можно ожидать от портирования игры с PS3 на ПК.

Я хотел бы отметить один важный момент про этот график: пожалуйста, не вырывайте цитату из контекста, и не говорите о том, какой быстрый DX11 по отношению к OpenGL. Такой результат — это непосредственные следствие того, как эти API используются в своих соответствующих бэкендах рендерига в базовом движке. Я думаю, что GL/Cg версия разработана в первую очередь для более близкого соответствия консолям, а не для лучшей производительности на ПК.

Достигнуть почти 300 FPS на высокопроизводительном ПК это неплохо, но в целом бессмысленно для пошаговой JRPG. Что больше впечатляет, и что является настоящей изюминкой всех стараний, так это производительность на действительно слабых системах, например GPD Win. В видео ниже игра запущена именно на нём. Как вы можете заметить, игра идёт плавно в родном разрешении 1280×720. В плане настроек, в этом видео используются “портативные” настройки.

Часть 2: Настройки

Загрузчик

Давайте начнём с общего вида на загрузчик игры:

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Здесь есть несколько моментов, на которых я хотел бы остановиться

  • У каждой настройки есть текст с описанием, и часто также есть визуальное сравнение настроек (справа).
  • Навигация по всем настройкам загрузчика возможна при помощи контроллера (на самом деле я написал небольшую програмку с естественной 2D-навигацией и изменением параметров в произвольных диалоговых окнах C# WinForms используя Xinput, и XSEED любезно разрешили мне выложить её в открытый доступ, что я и сделаю, когда будет время).
  • Нашли опечатку на скриншоте? Она уже исправлена.

Отображение

Тут представлены основные режимы экрана (оконный или полноэкранный) с или без v-sync. Относительно фреймрейта, представлены 3 настройки: ограничение в 30 FPS, ограничение в 60 FPS и без ограничения FPS. На консолях игра шла с ограничением в 30 FPS, но на ПК и 30 и 60 полностью поддерживаются. Настройка без ограничения FPS тоже весьма неплохо работала на моём ПК, но тут не было достаточного QA, поэтому используйте на “свой страх и риск”.

Наконец, я также добавил настройку Field of View (FoV). Конечно, тут она не так важна, как в играх от первого лица, но играя близко к большому монитору часто хочется видеть более широкий FoV. На скриншоте ниже представлено сравнение между стандартным FoV (слева) и очень высоким FoV (лично мне нравится просто высокая настройка, эта представлена для сравнения)

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Качество изображения

Этот раздел посвящен разрешению экрана, сглаживанию (AA) и фильтрации текстур. Разрешение работает именно так, как вы себе представляете. По части сглаживания, поддерживаются MSAA 2x, 4x и 8x, а прозрачный суперсэмплинг (TrSSAA) представлен тут как высококачественный вариант для улучшения поверхностей с альфа-каналом. Было странным обнаружить, что TrSSAA на самом деле гораздо более сложен в реализации на DX11 чем на Direct3D 9 или OpenGL, но, по крайней мере, это объясняет, почему так мало игр предлагают его. На изображении ниже представлено сравнение всех вариантов сглаживания. Само собой, разница гораздо лучше видна в движении:

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Перед тем, как перейти в шейдингу, есть один камень, который я хочу снять со своего сердца. Знаете, что меня действительно раздражает? Когда игра предлагает тебе выбрать AA, но не применяет его ко всему в игре (например, к моделям персонажей в меню). Мне пришлось расширить базовый движок для таких целей, но зато будьте уверены, если вы выбираете AA в Trails of Cold Steel на ПК, то оно применяется ко всему:

  • Основная игра будет с AA, само собой.
  • Отрендеренные портреты персонажей будут с AA.
  • Модели персонажей в окне инвентаря? С AA.
  • Модели персонажей во время спец-событий? С AA.
  • Да, даже рендеринг мини-карты получил MSAA. И TrSSA, потому что, а почему бы и нет?!

Ах да, ещё есть анизотропная фильтрация. Это простой чекбокс, потому что, честно говоря, нет никакой причины использовать что-то меньшее, чем 16xAF для этой игры. Даже GPD Win справляется с этим!

Шейдинг

Тут всё ещё интереснее. Представлено 4 варианта, относящихся к качеству динамических теней.

  • Разрешение теней (Shadow Resolution), как можно догадаться, регулирует разрешение теневых карт от “низкого” (“low) до “абсурдного” (“absurd”).
Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК
  • Источники теней (Shadow Casters), выбирают, какие объекты будут отбрасывать тень. Тени часто показываются только для определенных объектов по причинам производительности. Они “включены” только для тех объектов, которые действительно необходимы для сцены. Эта настройка перезаписывает значение по умолчанию и показывает тени для всех объектов.
  • Теневое расстояние (Shadow Distance), позволяет увеличить расстояние, на которое распространяются тени. Когда-либо раздражало появление и исчезновение теней через пару метров от вас? Понимаю, меня тоже. Ну что же, не в мою смену!
Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК
  • Наконец, Фильтрация теней (Shadow Filtering) обеспечивает более мягкие и эстетичные теневые переходы.

Даже с этими улучшениями теней игровое окружение всё равно смотрится немного плоско. Раз окружение, в отличие от сэл-шейдинга персонажей, рендерится в более реалистичном стиле, то я подумал, что более реалистичная современная техника Ambient Occlusion (AO) может выглядеть тут неплохо. С небольшой доработкой движка я смог встроить HBAO+, одно из высококачественных и высокопроизводительных решений AO. Вот как это выглядит:

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

Графика

Последнее, но не по значению, это настройки графики. Эти настройки выглядят недостаточно впечатляющими, здесь всего два чекбокса: и, честно говоря, высококачественная глубина резкости (High Quality Depth of Field) делает именно то, что и написано. И несмотря на то, что это приятное улучшение, писать тут особо не о чем.

Но с другой стороны, неограниченная дальность прорисовки (Unlimited Draw Distance), извините меня, за то что говорю это сам, действительно очень важное изменение. На самом деле, сделать что-нибудь с дальностью прорисовки — это практически первое, о чём меня попросили как только появилась первая часть этой статьи. Я полностью устранил все виды проблем с внезапным появлением объектов, заставив их прорисовываться на любом расстоянии. На некоторых картах это значительно увеличило нагрузку на CPU, особенно вместе с включением всех теней, но тут нет ничего, с чем бы не справился современный настольный ПК.

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

Остальные улучшения и итог

В дополнение ко всем этим настройкам, добавлены ещё несколько улучшений по отношению к консольной версии, которые “постоянно включены” и не представлены в загрузчике. Например, эффект свечения рендерится с четырехкратной точностью, и когда возможно несжатые текстуры используется вместо сжатых ассетов, созданных для консолей.

Часть 3: Разное

Турбо мод

Первая дополнительная особенность - Турбо мод. Если эта настройка включена в загрузчике, то при зажатии R2 (или эквивалента на клавиатуре/мыши) скорость битв, катсцен и даже передвижение по карте увеличивается в 4 раза. Это позволяет очень быстро завершить “не важные” битвы или пересечь обширные территории. Когда турбо мод включён, на экране появляется соответствующая иконка:

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Это не новая фишка, несколько портов на ПК за последний год имеют такую возможность, но здесь она полностью интегрирована и имеет одну небольшую возможность, которую я назвал “Умное Турбо”. В Trails of Cold Steel, когда ты “выводишь из равновесия” врага, на экране на короткое время появляется возможность совершить спец-атаку. В этот момент, даже несмотря на включенный турбо мод, игра возвращается к оригинальной скорости, чтобы игрок успел выбрать эту спец-атаку.

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

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Поддержка ультрашироких экранов

Поддержка дополнительных соотношений сторон экрана в JRPG с большим количеством UI-элементов, и особенно в той, которая изначально была создана под 16:9 — это не самая тривиальная задача. Среднее время на решение этого вопроса я оценил в несколько полных рабочих дней. Поскольку время (во вполне прямом смысле) — деньги, я даже и представить не мог, что XSEED решится на внедрение такой настройки. По последним данным опросов Steam этим пользуются меньше 2% потенциальных игроков.

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Что же, они пошли на это, и после работы над 32-мя отдельными проблемами, игра теперь поддерживает любое соотношение сторон выше 16:9 из коробки! Конечно, с некоторыми ограничениями: в основном связанными с тем, что меню остаётся в 16:9, и, также, часть UI для битв не очень удачно переходят границу кадра 16:9. Но для большинства ситуаций я разработал уникальные решения, которые, на мой взгляд, выглядят довольно красиво.

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Конечно же, если уж я делаю поддержку экранов с широким соотношением сторон, то я не ограничусь только 21:9. Все соотношения сторон выше 16:9 должны работать, по крайней мере, в теории. Поэтому если, скажем, у вас установка с тремя мониторами и соотношением сторон 48:9, то игра у вас будет выглядеть так:

Питер «Durante» Томан о портировании The Legend of Heroes: Trails of Cold Steel на ПК

Должен признать, что поддержка ультрашироких экранов не тестировалась так же усиленно, как 16:9, поэтому есть вероятность, что где-то будут маленькие графические проблемы. Если вы нашли такие, напишите мне!

Заключение

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

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

* * *

ПК-версия The Legend of Heroes: Trails of Cold Steel вышла 3 августа 2017 года в Steam, GOG и Humble Store.

Оригинальные статьи в блоге XSEED: часть 1, часть 2, часть 3.

1414
9 комментариев

Кто-то видит разницу между HBAO+ on и off? Типо это "добавляет глубины и пластичности, а также делает объекты в тени более приземленными". Просто я читаю с телефона и мне с этого экрана не видно никакой разницы между включенной и выключенной. Мб у меня глюки? :/

1
Ответить
Автор

У меня получался какой-то косяк, когда я попытался залить гифку. При наложение это лучше понятно: http://www.xseedgames.com/develop/wp-content/uploads/2017/07/hbao.gif

3
Ответить

Святой человек

2
Ответить

Игру запускал, думаю с такой оптимизацией пойдет на чем угодно. А турбо-режим необходим всем jrpg с пошаговыми боями.

1
Ответить

Ребёнка пустили в магазин игрушек : )
Ему повезло, что графика была не требовательная, поэтому "кидал в корзину" всё, что хотел.
Но вот при требовательной графике уже приходится ухищряться, идти на компромиссы и вырезать, чтобы сносно шла на последнем железе.

1
Ответить

Большая статья. Читать я ее, конечно, не буду. Как можно говорить о оптимизации такой графики во времена когда у нас есть например оптимизированная графика Ведьмака 3.

Ответить

А мог прочитать, прежде чем высказывать свое, несомненно, важное мнение. Игра выбрана тут чисто в качестве примера, чтобы продемонстрировать возможности при портировании игры на пк, и некстгеном 12/10 ведьмаком от мира jrpg она быть не должна.

3
Ответить