Портирование игры в одиночку на Xbox и Switch

Вступление

Приветствие всем мимо проходившим и кто намеренно набрёл на эту статью!

Несколько лет назад я уже рассказывал о своей игре Vzerthos и её разработке вот в этой статье, а сейчас пришло время развития событий — спустя пять лет игра посетила три платформы! В этой статье я расскажу о своём опыте портирования ПК версии игры на Xbox и Switch.

Признаюсь, что так или иначе это самореклама игры и конкретно для платформы Nintendo Switch. Но сама статья о портировании игры на консоли и каким изменениям подверглась игра на этом пути.

Очень краткое содержание прошлой статьи

Самый первый скриншот игры в 2016 году
Самый первый скриншот игры в 2016 году

Разработка началась в 2016 году сразу на два конкурса разработки игр, где была определена тематика и жанр игры — top-down shooter с pre-render графикой в фэнтези антураже, где герой «вспоминает» своё путешествие.

Удачный опыт участия в конкурсах (для меня) такой: составить в простом TXT-файле список-описание, чётко следовать плану. Вероятно от небольшого процента идей придётся отказаться, но зато результат будет похож на изначальную задумку.

В разработке использовались такие инструменты как GameMaker Studio 1.4, Blender 3D, Photoshop CS2, Paint Tool SAI и FL Studio.

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

В игре имеются комиксы-заставки и рисовались они очень долго — наверно где-то месяц. Сначала в Photoshop, а дальше я перешёл на SAI так как там куда лучше рисуется line art. В итоге было нарисовано где-то 25 «страниц» комикса на всю игру.

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

Релиз игры состоялся в Steam в 2017 году 19 января. То есть более 5 лет назад.

Вот так выглядела игра к релизу
Вот так выглядела игра к релизу

Портирование

А теперь собственно к основной теме этой статьи — портирование на консоли. Прежде всего этот процесс можно описать как оптимизация игры под конкретные запросы платформы. Например, очевидно, что у консолей игровой контроллер это геймпад, а не клавиатура с мышкой (хотя и такое бывает), следовательно нужно переделать управление с клавамыши на геймпад. Так же сюда относятся и работы каких-либо игровых сервисов, например, Xbox Live. Есть и особый момент с сохранением и загрузкой прогресса игры. И конечно же самое очевидное, что предполагается под оптимизацией — оптимизация производительности игры на конкретном железе консоли, чтобы всё работало плавно и чётко.

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

Особо это проблемно со устаревшими играми, например, как Vzerthos – между релизом в Steam и портированием на консоли я уже успел сделать новую игру - Drawngeon, где использовал опыт предыдущих разработок и по мере создания набил новые шишки. В итоге смотреть на код и некоторые решения внутри Взертоса было очень тяжко, как и менять их для порта.

Какие-то вещи конечно я разглашать не могу так как подписано соглашение о неразглашении, но постараюсь рассказать о портировании ПК версии игры со Steam на консоли Xbox и Switch.

Xbox версия

Microsift были молодцами и до недавнего времени у них была UWP то есть универсальная платформа — приложения (и игры) могли работать как на Windows 10, так и на Xbox One. Молодцами они были и тогда, когда позволяли использовать простой retail devkit (консоль из магазина, которую можно перевести в режим разработчика) для тестирования и выпуска игр на Xbox.

Как это проходило — для начала нужно было подать игру (MS называют это концептом) на особую программу, пройдя которую игра получает полный доступ к возможностям Xbox live. Собственно Vzerthos сразу прошёл, но я долгое время не начинал портирование. И только где-то в 2020 или даже 2021 году понеслась жара.

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

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

Поддержка Контроллера

В ПК версии у меня такое уже работало, можно было играть с геймпада и никаких проблем. Именно подметил, что играть ведь пройти было уже затруднительно. Дело в том, что игра всё же shooter, хотя многие относят его к hack’n’slash, а следовательно прицеливаться проблемно да ещё и там было две настройки — либо двигать стиком прицел, либо выбирать направление прицела — просто жуть.

Было решено полностью переделать управление с геймпада и добавить пару новых моментов для улучшения игрового опыта, кажется это называют quality of life.

Портирование игры в одиночку на Xbox и Switch

Управляться с прицелом было сложно, поэтому был добавлен переключатель target-lock, чтобы зафиксировать цель атаки. И до простят меня игроки, но повесил я это действие на нажатие стика. Стало как мне кажется гораздо лучше, выбирая направление взгляда прицел сам «магнитился» к ближайшему врагу на пути этого самого взгляда, а тут ещё и таргет лок, благодаря которому прицел не сказал от врага к врагу.

В ходе тестов и некоторых отзывов всё же даже этого оказалось мало и игроки всё равно писали о сложности в прицеливании. Тогда мне пришлось вспомнить самое жуткое — автоприцел! Ладно, не совсем так, а скорее доводка снаряда — теперь снаряды при выстреле имели нужное направление.

Ещё в период релиза в Steam я нашёл какой-то сайт с торрентом игры и там был комментарий со смыслом вроде «ох ах, нет перекатов как в Dark Souls как печально». Ну что сказать, спустя 5 лет …

Тут и target lock и перекаты

А теперь сохранения и загрузка

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

Вернее как. Зачем — понятно, это же процесс сохранения, но играя скажем в Return to Castle Wolfenstein нажимаешь на клавишу быстрого сохранения и получаешь простую надпись «игра сохранена». Неужели в новых проектах это лишь для красоты такое сделано? Выглядит конечно интересно и если сохранение проходит моментально, то зачем долго показывать эту анимацию?

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

Внезапно и не в тему держите одну "страницу" комиксовой заставки, без текста, да.
Внезапно и не в тему держите одну "страницу" комиксовой заставки, без текста, да.

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

Конечно я пошёл чуть дальше и в принципе поменял структуру файла сохранения, что потом создало несколько проблем для обновления игры на ПК так как старые сохранения больше не подходили и нужно было написать конвертер. Ну что сказать — «я автор и я так вижу» и хочу улучшать игру.

Структура данных полностью поменялась и стало только лучше, а в одном месте даже логичнее — у меня в игре есть такая вещь как «система подбора новых предметов». Я её честно подсмотрел из Devil May Cry – когда игрок подбирает новый предмет, то ему показывается небольшая анимация и описание предмета. И вот раньше такие анимации работали на каждую новую игру для каждого слота (в игре их четыре), а теперь так сработает лишь один раз так как сохраняется этот прогресс «глобально» вне слотов.

(Если можно было бы сделать скриншот сохранения, то он бы здесь был)

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

Я пытался снять gif-ку, но вышло оно вот так дёргано и непонятно

Производительность

Здесь нужно будет окунуться в технические дебри движка. Мне казалось, что код и двухмерность игры будет как пшик для устройства вроде Xbox One S, но как оказалось что-то не так и даже моя технически простая игра выдавала там в лучшем случае 24 FPS (кадров в секунду) и тогда начался процесс попытки повысить производительность.

Первым «под нож» попала система сменяемых интерфейсов, которой для ПК версии я даже гордился. Суть её в том, что игрок может изменить или добавить файл с описанием интерфейса и даже поменять там графику. Вероятно таким никто не занимался, но в игре было целых три официальных интерфейса — один из них сделал мой друг, который следил за разработкой с 2016 года, другой «классический» с портретом внизу по центру doom-like и третий добавленный где-то под конец разработки AliceNox, который отсылает сразу к двум играм — American McGee’s Alice и игру Nox. В Nox я даже не играл — мне указали на игру и сказали, что похожа на мою, чему я удивился.

Должен сказать, что вырезана оказалась именно часть со сменой интерфейса, в проекте до сих пор доступны два из них.

Интерфейс AliceNox. Как видно здесь кругом тыквы <span>— </span><span>это событие в игре, где на герое появляется шапка из тыквы, а из тыкв можно получить дополнительное золото. Есть аналогичное событие и под Рождество. </span>
Интерфейс AliceNox. Как видно здесь кругом тыквы — это событие в игре, где на герое появляется шапка из тыквы, а из тыкв можно получить дополнительное золото. Есть аналогичное событие и под Рождество. 

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

Но даже этого оказалось недостаточно и FPS в игре был на уровне 40, что не 60. Кстати (не)интересный факт — оригинальная игра 2017 года на ПК работала в 40FPS, но не потому что такая сложная в вычислениях, а по непонятной для меня причине я выставил именно такой лимит кадров игровой логики. Для порта понадобилось править таймеры так как там была завязка именно на такт игровой логики, а не реальном времени — поэтому лучше использовать именно delta time – чтобы вычисления времени зависели от разницы между временем текущего и предыдущего кадра.

Если использовать тик игровой логики и при этом не ограничивать кадры (допустим запускаем старую игру на современном компьютере), то можем получить бешеные скорости — думаю такое знакомо некоторым пользователям DOSbox.

Меня не устраивали значения ниже 60FPS и поэтому прибегнул к крайней мере — YYC.

Как вы знаете игру разрабатывал на движке GameMaker и он имеет, так сказать, два метода генерации кода игры — VM и YYC. VM — это “виртуальная машина” то есть код игры выполняется прямо на лету, интерпретируется. Можно сказать, что там сидит программа, читает код и выполняет его по мере чтения. YYC же это полноценный компилятор, который собирает код игры из скриптового языка GML в полноценный С\C++, а дальше этот код компилируется в бинарные файлы. Переход с VM на YYC даёт значительный прирост производительности — около 50%, так что я добился своих 60FPS.

Разрешение окна и экрана

Проект на ПК мог менять разрешение окна, как и большая часть ПК игр и казалось бы, если такой функционал есть, то и трудностей для адаптации под 1920х1080 не будет. А они появились и пришлось переписывать старый код на новый, чтобы на Xbox двум пикселям разрешения соответствовал один пиксель игрового вида, ведь оригинальная версия имела странное разрешение. Вот я и пишу — править старый код и системы, когда было мало опыта — это жуть!

По причине изменения работы разрешения игры и оптимизации я был вынужден удалить из игры интерфейс моего друга, но не беспокойтесь — в титрах он всё ещё получает благодарности!

Но забегая вперёд — пришлось изменить систему ещё раз.

Интерфейс, который пришлось вырезать из игры. Скриншот со старой конкурсной версии.
Интерфейс, который пришлось вырезать из игры. Скриншот со старой конкурсной версии.

Изменения графики

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

Например, с переработанной системой ввода для геймпада был нарисован и сам геймпад, заодно я попробовал программу Affinity Designer в пробный период. Так же были перерисованы некоторые эффекты, например, молнии-снаряда и спрайты (де)баффов. А для одного «предмета» для показа была нарисована аж целая анимация в бесплатной программе Krita.

Новая анимация использования способности главного героя, в изначальной версии такого не было.

Достижения

В Steam с достижениями всё очень просто — пара-тройка функций, вызывай и получай, а вот для Xbox Live иначе. Дело в том, что Microsoft даёт рекомендации по использованию своего сервиса и игра не должны делать больше N обращений к системе. Это усложняет достижения, которые имеют прогресс по сбору, например, золота. То есть нельзя обновлять достижение каждый раз как подобрали предмет — есть риск превысить лимит. Особенность достижений Xbox и Steam ещё в том, что достижения зелёных имеют процент завершения и некоторое количество очков, а в Steam это просто «открыто» или «закрыто», хотя там есть возможность привязать некоторую статистику к достижению и получить те же проценты.

Сборка и отправка

Могу сказать, что собирается проект достаточно долго, виной всему вероятно YYC.

Сборки конечно же нужно отправлять в Microsoft и дальше они смотрят по своим требованиям подходит ли игра и присылают небольшой отчёт. Поэтому релиз может затянуться так как могут всплыть всякие неприятности на проверке. Если думать, что вот отправил на проверку и за неделю прошёл, то нет — может пройти и месяц, как в моём случае. Чаще мне отбраковывали сборку по причине частых обращений к Xbox Live.

Релиз-Итоги

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

В итоге Vzerthos вышел в Microsoft Store 14 октября 2021 года.

Ну что, устали? А это почти половина!

Switch версия

История достаточно странная, как по мне. Дело в том, что разработчиком Nintendo я числюсь очень давно и лишь недавно смог получить девкит консоли. Конечно в основе Switch версии лежит как раз Xbox версия, то есть я чуть-чуть подошёл к «идеальному порту» - версии очень похожи, можно сказать идентичны.

Долго я не мог получить девкит и даже писал «Nintendo Россия» и Яши Хаддажи, но это никак не помогло. С некоторой периодичностью писал N на почту для разработчиков и вот под конец 2021 появился шанс получения особой консоли. Конечно как сейчас с этим — совсем непонятно.

Контроллер снова

На самом деле я немного наврал выше — несмотря на то, что были проведены улучшения для управления с геймпада для версии Xbox, но всё равно что-то было не так. Как раз для Switch версии я добавил небольшую доводку снаряда.

У Nintendo Switch есть особенность — HD вибрация. И действительно, если сравнивать её с другими геймпадами (возможно dualsense не в счёт), то у них вибрация «примитивна», а у Switch другого толка. Я воспользовался этим и повесил вибрацию на большее количество действий игрока — даже на переключение кнопок меню, ведь можно давать очень малые вибрации.

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

Текст выходит за рамки @ Nintendo спит. Написал "стик" вместо "мини-джойстик" @ Nintendo проснулась и выдала отказ.
Текст выходит за рамки @ Nintendo спит. Написал "стик" вместо "мини-джойстик" @ Nintendo проснулась и выдала отказ.

Разрешение экрана. Снова. Сага.

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

Больше всего проблем при портировании на Switch было связанно как раз с разрешением — пару раз проваливал тестирование сборки от Nintendo. Оказалось, что самое меньшее выдаваемое разрешение Nintendo Switch это не 720р, а 480р! Как так? При подключенном Switch к ТВ через докстанцию можно выбрать в сигнал и оказалось, что там может быть не только 1080р, но и 720р и 480р. Ради этого пришлось изменять систему смены разрешения и даже править некоторые моменты с шрифтами и размерами текста.

(здесь мог бы быть скриншот в 480р, но зачем нам ПК-боярам на это смотреть?)

Сохранения

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

Производительность

Аналогично версии Xbox необходимо было использовать YYC компилятор. Это было весьма ожидаемым, учитывая мощность Switch и если уж Xbox не мог запускать VM версию.

Достижения

У Nintendo нет системы достижений или сервиса, как у Microsoft Xbox Live или у Sony PSN. Удалять их из игры мне не хотелось — у тех платформ они есть, а у этой не будет? Так не пойдёт! Поэтому я сделал «локальные достижения».

Благодаря тому, что для Xbox-порта я написал “обёртку” прогресса и получения достижений, то создать локальную систему достижений было очень просто. Оставалось только добавить механизм информирования игрока о полученном прогрессе достижения. Места на экране не так много, а фантазия у меня иссякла, поэтому нагло украл я взял дизайна со Steam и выглядит это вот так:

Вот тут видно показ достижения. А так же классический интерфейс.
Вот тут видно показ достижения. А так же классический интерфейс.

Релиз-Итоги

Как и Microsoft у Nintendo есть отдел проверок сборок игр на соответствие их платформе. Могу сказать, что японцы (на самом деле там зависит от региона) тщательно смотрят сборку. Например, пару раз я не прошёл проверку, потому что вместо слова «контроллер» использовал «геймпад»!

И завершив заполнения различных данных и пройдя все проверки сборки игры начинается этап - заполнение данных для магазинов. У eShop несколько регионов, а моя игра вышла в трёх из них — Америка, Европа и Япония. У каких-то регионов есть свои требования, например, для Америки необходимо отображать рейтинг игры прямо в видео трейлера как раз те самые ESRB.

Игра вышла на Switch 14 июля 2022 года — совсем недавно.

Извиняюсь, но хочу побухтеть

Небольшая вставка ворчуна. Ворчание относится к девкитам. Сейчас можно даже откинуть текущую ситуацию в мире так как я негодовал с этого многие годы назад. Связаны мои недовольства с тем, что девкиты в принципе существуют. Вы представьте, что если бы для разработки на ПК нужен девкит-ПК? Консоли те же компьютеры и отличает их лишь софт. Я понимаю существование и секретность девкитов, если они относятся к передовым студиям и необходимо сделать лаунч тайтлы. Но различные конторы говорят, что поддерживают инди, но на деле где же это? Сейчас как по мне термин инди размыт, но давайте подумаем — инди то есть независимый собственно независит от издателя. Издателю выгодно набрать индюков, а консольные платформы всё усложняют от чего выгоднее именно издателям, а не индюкам.
Вот чем был хорош Microsoft – вы идёте в магазин и покупаете обычный Xbox One\Series переключаете его в режим разработчика и можете использовать его собственно как девкит. Но потом оказывается, что не все движки его видят и не подходит, а дальше они отказываются от UWP, от всей этой системы и вот у нас снова тыква. Боязнь пиратских пиратов платформами и поэтому отказ от введения понятия ретейл-девкит весьма странная. Я специально изучал некоторые видео по взлому консолей и угадайте что я там видел? режимы разработчиков. В каких-то местах если поискать думаю можно найти и SDK платформ. Уж нечестные разработки это или какие-то хитрые хакеры — неважно, но «отдельная железяка» не спасает от пиратства.

Чтобы не раздувать статью и забайтить вас на возможные комментарии — думаю можно продолжить жаркую или не очень дискуссию там по теме девкитов.

Ворчать это вам не игры делать!
Ворчать это вам не игры делать!

Некоторые Итоги

Было проделано много работы между оригинальной ПК версией и Xbox, но между Xbox и Switch версии не сильно много изменений. Однако, куда интереснее взглянуть даже на начальные задумки и версии аж с 2016 года и то, что вышло в 2022. Мне кажется я смог улучшить свои навыки полировки игр, может быть даже геймплейных решений, но для игромеханических прокачек лучше делать новые игры, а не портировать старые.

Очевидно, что текущая ситуация в мире задела и эту область. Например, Microsoft не принимает концепты игр, а у Nintendo я кое-как смог скачать промо-коды своей игры. О доставках девкитов непонятно. А что будет дальше — совсем неясно. И вот она, очередная проблема «особых версий железок консолей».

Достаточно интересно видеть свою игру на консоли, а не компьютере. На ПК нынче может делать игры кто угодно и одно дело запускать свою игру на компьютере, например, через архив с EXE и совсем другое скачивать и управляться на консоли уух!

Спасибо всем дочитавшим! А кто проскроллил — вы просто потратили ресурс своего колеса мышки (или пальца?)!

6161
17 комментариев

"Вы представьте, что если бы для разработки на ПК нужен девкит-ПК?"
Представил. В Steam стало бы гораздо меньше говно-игр.

5
Ответить

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

4
Ответить

Ни черта в создании и портировании игр не понимаю, но было интересно почитать.

5
Ответить

Спасибо, было очень интересно почитать. А как устроено с компиляцией на Switch? Поддержка встроена в GameMaker?

Ответить

Спасибо что прочли! Да, GameMaker поддерживает встроена, но я совсем забыл написать, что для консолей оно работает по подписке. Владельцы GameMaker относительно недавно сменили свою систему монетизации и теперь движок в принципе по подписке, но старым покупателям дали так сказать "компенсацию" подпиской.
Тестировать тоже удобно - само устройство подключается к ПК по usb прямо как смартфон на andriod и игра напрямую заливается в девайс.

1
Ответить

Можно тупой вопрос от обывателя? Система достижений имеет какие-то требования? То есть впихни 1000 очков куда хочешь? Или "да у тебя игра маленькая, вставь 100 очков"?

Ответить

Майкрософт выделяет 1000 очков, меньше нельзя. Дальше эти очки распределяешь на достижения, но на одно достижение максимум 200 или 100 очков, уже подзабыл.

1
Ответить