что такое кроссплатформенность в играх
Что означает кроссплатформенность для игр и других приложений?
Вик Кей / Shutterstock.com
Возможно, вы слышали термины «кроссплатформенность» и «кросс-игра», которые часто используются в игровом сообществе. Они действительно относятся к функциональности, помогающей преодолеть различия между всеми вашими системами: вашими игровыми консолями, компьютерами и мобильными устройствами.
Более чем одна система
Кросс-платформенный — это термин, используемый для обозначения части программного обеспечения, совместимого с более чем одной системой. Например, популярный медиаплеер VLC совместим с тремя основными настольными операционными системами: Microsoft, Mac OS и Linux. Кросс-платформенная поддержка также может распространяться на мобильные устройства, при этом многие приложения доступны как в Apple App Store, так и в Google Play Store.
В зависимости от того, как запрограммировано конкретное программное обеспечение, разработчику может потребоваться полностью перекодировать и переупаковать программное обеспечение. Некоторые фреймворки позволяют разработчикам более плавно включать кроссплатформенную поддержку своего программного обеспечения.
Есть много причин, по которым вы используете кроссплатформенное программное обеспечение. Например, при использовании программного обеспечения одним из наиболее важных факторов является совместимость файлов. Если вы используете формат файла, доступный только в одной операционной системе, вы можете подумать о преобразовании его в формат с помощью средства чтения, которое работает в нескольких системах.
Расцвет кроссплатформенных игр
Когда дело доходит до игр, кросс-совместимость — большая тема. В разгар консольных войн с 1980-х до начала 2010-х кроссплатформенная совместимость была большой проблемой. Основные производители игр, такие как Sony, Microsoft и Nintendo, производили и финансировали игры. Эти игры часто разрабатывались их собственными студиями или игровыми студиями, с которыми у них было стратегическое партнерство.
Поэтому многие игры были «эксклюзивными», их можно было купить и играть только на одном устройстве. Когда потребители решают, какую консоль покупать, они должны учитывать, какие игры доступны для конкретных консолей. Halo всегда будет на Xbox, Uncharted будет на Playstation, а Марио будет на консолях Nintendo.
В то время как Nintendo в основном придерживалась эксклюзивных предложений, Microsoft и Sony начали предлагать более кроссплатформенную поддержку. Из-за роста популярности компьютерных игр в последнее десятилетие многие крупные эксклюзивные игры начали появляться на ПК и консолях. Из-за более высокого потолка производительности на настольных компьютерах разработчики также начали разрабатывать свои игры с учетом потребностей компьютерных геймеров и снижать производительность при переходе на консоли.
Кросс-игра и почему это важно
Эпические игры
Помимо возможности играть в разные игры на одном устройстве, одним из самых важных соображений для тех, кто стремится к совместимости на разных платформах, является кроссплатформенная игра, часто называемая кросс-игрой. Это относится к функции, которая позволяет людям, играющим в одну и ту же игру на разных устройствах, играть вместе в многопользовательских режимах. Например, люди, играющие в Fortnite на Playstation 5, смогут играть против и в тандеме с пользователями-игроками, использующими ПК с Windows.
По мере того, как игры становятся менее эксклюзивными, в последние несколько лет растет популярность кроссплатформенной игры. Несмотря на то, что некоторые противники все еще остаются, например, с Nintendo, большинство производителей и разработчиков игр начали открываться для ее реализации. Люди из одних и тех же групп друзей, которые владеют разными платформами, но все же хотят играть друг с другом, получают большую выгоду от игр с этими функциями.
Кросс-игра также значительно увеличивает доступную базу пользователей конкретной игры, что хорошо как для игроков, так и для разработчиков. Активное большое сообщество сокращает время ожидания, увеличивает диапазон уровней навыков, доступных для игры, и делает более привлекательным для новых игроков начало игры.
Вот некоторые из самых известных игр с поддержкой кросс-игры по состоянию на 2021 год:
Будущее кроссплатформенности и кроссплатформенности
Учитывая, насколько эта функция вошла в игры за последние несколько лет, вы, вероятно, увидите больше игр с кроссплатформенной поддержкой. Игровые студии начали осознавать, насколько кросс-игра полезна для активности игроков. Мы не удивимся, если в большинстве многопользовательских игр в будущем будет поддержка кроссплатформенной игры.
Если вам интересно узнать больше о кроссплатформенных играх, в которые вы можете играть со своими друзьями, вам следует прочитать обзор наши любимые кроссплатформенные игры.
Кроссплатформенность — это круто
Ни для кого не секрет, что сегодня мобильные игры очень популярны. Возможность написать одну из таких игр есть у каждого разработчика, даже начинающего. Часто возникает вопрос с выбором платформы. Конечно, хочется, чтобы игра была сразу везде: на iOS и Android, на WP7 и MeeGo, на десктопе и в браузере. И чтобы все это можно было лекго реализовать с помощью бесплатных инструментов.
В этой статье я расскажу вам, как сделать основную часть кода платформонезависимой, а для остального использовать удобные средства разработки для каждой конкретной платформы.
Цель игры, изображенной на рисунке выше — успеть попасть по яблоку, пока оно летит вниз. Со временем количество яблок увеличивается, и не пропускать их становится все сложнее. Яблоки падают под произвольным углом, вращаясь и реалистично отскакивая от границ благодаря физическому движку Box2D. Игра будет запускаться на Android, платформах с поддержкой Qt (Symbian, Maemo, MeeGo, Windows, Linux, Mac OS X) и в браузере Google Chrome.
Выбор удобных инструментов
Так как основную часть кода я буду писать на чистом С++ (почему, читайте в конце статьи), IDE для этого подойдет любая. Я выберу Qt Creator, хотя ничего не мешает мне использовать Microsoft Visual Studio или Eclipse, например.
Для платформы Android я остановлюсь на библиотеке libgdx. С ее помощью легко можно рисовать текстуры, проигрывать звуки и делать другие необходимые вещи.
В качестве инструмента для разработки игры на десктопе я возьму Qt. Я давно знаком с этой библиотекой, и она не перестает меня радовать. При использовании Qt я также получу приятный бонус в виде поддержки мобильных операционных систем Symbian, Maemo и MeeGo.
Также специально для этой статьи я с помощью HTML5, javascript и Google Native Client сделаю так, чтобы игра запускалась в браузере Google Chrome. Я буду использовать HTML5 Canvas и Audio, и вы увидите, насколько это легко и просто.
Реализация логики не сложная, поэтому я не буду писать о ней (желающие могут взглянуть на код). Вместо этого я сконцентрируюсь на том, как заставить игру работать на всех операционных системах.
Абстрагируемся от конечной платформы
Как я уже говорил, основная часть кода будет общей для всех платформ. Назовем ее «движок». Мне нужно будет решить две задачи. Первая — вызов методов движка на каждой платформе:
Для этого движок предоставит платформам следующий интерфейс:
Вызовы обработчиков рисования и ввода на различных платформах будут вызывать методы из класса Application, например, при использовании Qt это будет выглядеть так:
На Android выйдет немного сложнее, потому что из Java нужно попасть в C++:
После этого в C++ вызываются соответствующие методы:
При использовании Native Client в браузере из javascript нельзя напрямую обращаться к С++, вместо этого надо отправлять сообщения модулю, например, строки:
В С++ сообщения анализируются, и в зависимости от содержания вызывается тот или иной метод:
В итоге движку не важно, из какой платформы был вызов, он абстрагировался от этого. Но он знает, что произошло касание экрана в точке (x, y) или пришло время для обработки физики и вывода изображений на экран.
Обратное взаимодействие
Вторая задача — обратное взаимодействие движка с платформой:
Это нужно для того, чтобы движок командовал, когда выводить изображения и текст на экран, проигрывать звук, вибрировать. Для этого все платформы должны реализовать общий интерфейс. Назовем этот интерфейс Platform:
На уровне движка я не привязываюсь ни к какой конкретной платформе, я не загружаю картинки или аудио файлы, вместо этого я использую числовые идентификаторы. Когда я хочу вывести изображение на экран, или проиграть звук, я делаю следующее:
Таким образом движок абстрагируется от деталей реализации различных операций на каждой платформе. Привожу для наглядности диаграмму классов:
Сложно ли все это сделать? Вы убедитесь в том, что нет. Время, конечно, придется потратить, но в большинстве случаев им можно пренебречь в сравнении со временем, потраченным на программирование логики приложения. Я приведу код для платформ Android, Qt и Native Client для каждой необходимой операции:
Рисование изображения, Android (libgdx):
Рисование изображения, Qt:
Рисование изображения, javascript (HTML5 Canvas):
Рисование текста, Android (libgdx):
Рисование текста, Qt:
Рисование текста, javascript (HTML5 Canvas):
Проигрывание звука, Android (libgdx):
Проигрывание звука, Qt:
Проигрывание звука, javascript (HTML5 Audio):
Вибрация, Android(libgdx):
При реализации для Android придется немного повозиться с вызовом java кода из C++ — один раз получить ID нужных java методов:
и потом вызывать их:
Нетривиальная ситуация и с Native Client — нужно отправлять сообщения из С++ кода в javascript:
И в javascript эти сообщения парсить:
Результат
Эта простая игра называется «Поймай яблочко». Предлагаю запустить и попробовать продержаться пару минут, у меня вначале не получалось:
— Native Client версия (убедитесь, что у вас последняя версия браузера Google Chrome, и Native Client включен в about:plugins и about:flags). Размер исполняемого файла nexe — 4.2Мб для 32-битных систем и 4.9Мб для 64-битных, при медленном соединении придется немного подождать;
— Windows версия — для тех, кто не любит Google Chrome.
Игра прекрасно запускается на Android эмуляторе и моем LG Optimus. Та же ситуация с Qt Simulator (скриншот с Nokia N9 в самом начале темы).
Код можно взять тут, я думаю, он может пригодиться кому-нибудь, особенно участки, которые отвечают за связку Java и C++, javascript и C++ (если по этому поводу у вас возникнут вопросы — задавайте, не стесняйтесь, с удовольствием отвечу).
Зачем все это?
Многие из вас подумают, зачем писать велосипед? Если есть Marmalade или Unity, например. Есть, но они стоят денег, да и зачем такие тяжеловесы для простой 2D игрушки? Некоторые говорят также, что Qt заводится на Android и iOS, но на самом деле на Android не очень так заводится, без звука и OpenGL, а на iOS так вообще, только ролики на YouTube. Мне очень нравится Qt, и я надеюсь, что в недалеком будущем приложения для iOS и Android можно будет писать так же просто, как сейчас для MeeGo, но пока лучше пользоваться другими инструментами для этих платформ.
Преимущества
Используя подход, описанный в этой статье, вы не привязаны к платформе, вы можете использовать те инструменты, которые хотите, а в последующем легко их менять. На десктопе — Qt или GTK, на Android — libgdx или AndEngine, на iOS — cocos2d, выбор за вами. Можете вовсе отказаться от движков, используя API, предоставляемое платформой. Большую часть времени вы можете писать и отлаживать код в вашей любимой IDE на великом и могучем C++.
Недостатки
Недостатки, конечно, тоже есть, например, вы не сможете пользоваться готовыми UI компонентами — вам нужно будет реализовать их на C++. Либо выносить UI часть приложения в каждую платформу. Также вам обязательно придется тесно познакомиться с каждой платформой, но как показывает практика, полностью уйти от этого знакомства никогда не удается.
Как подготовить игру к портированию на ПК и консоли
Преимущества кроссплатформенных игр уже долгое время обсуждаются в кругах геймеров, но мало освещаются в среде разработчиков. Существует не так много статей о базовых вещах, необходимых для создания кроссплатформенной игры.
Тем не менее, кроссплатформенность сейчас находится на подъеме. Появляется все больше и больше игр, обладающих этим свойством. Fortnite, Call of Duty, Street Fighter ― все они разных жанров, по-разному реализованы, но в той или иной степени обладают функциями кроссплатформенности.
Андерсен Хоровиц в своем блоге писал о том, что игры исторически сегментировались различными платформами, но теперь с ростом популярности кроссплатформменности количество мультиплеерных игр тоже растет все больше и больше.
Зачем нужно делать игру кроссплатформенной?
Для игроков это здорово: не нужно выбирать, на каком устройстве запускать игру, ― можно беспрепятственно играть с друзьями, не беспокоясь о том, есть ли они в базе игроков.
Для разработчиков игр это тоже здорово, ведь пользовательская база теперь не сегментирована по разным платформам ― вместо этого можно организовать один большой пул игроков и создать более богатый многопользовательский опыт с более полными игровыми сессиями.
Отлично, так давайте портировать нашу игру на несколько платформ!
Конечно, звучит классно, почему бы и нет. Вот только…
Во «Властелине колец», если вы помните, на совете Элронда герои тоже обсуждали, мол, давайте же просто сделаем, что должны, на что Боромир сказал:
А все потому, что Боромир знает: создание полноценной кроссплатформенной игры ― это не так-то просто.
Так появилась идея подготовить материал для тех, кто подумывает о создании собственной кроссплатформенной игры.
Если вы уже издавали игры раньше, значит, вы имели дело с их отправкой на различные платформы и знаете возможности каждой из них, что будет хорошей основой для сегодняшнего материала ― и, кроме того, поможет на начальном этапе подготовки.
9 вещей, которые вам необходимо учесть перед созданием кроссплатформенной игры
Совет №1: Ознакомьтесь с терминологией
Различных понятий, связанных с кроссплатформенностью, довольно много, но для начала введем самые необходимые: cross-play, cross-progression и cross-buy.
Cross-Play (кросс-игра, или кроссплей) ― это как раз то, о чем люди думают, когда слышат о кроссплатформенной игре: объединение пользователей, играющих на различных платформах, в одну многопользовательскую сессию. То есть, когда игроки Xbox могут столкнуться в игре вместе с игроками PlayStation или Steam.
Cross-Progression (или Cross-Save, кросс-сохранение) называют возможность начать играть на одной платформе, сохранить свой прогресс и продолжить игру на другой платформе. Подобное можно встретить как в однопользовательских, так и в многопользовательских играх.
Cross-Buy (или Cross-Commerce, кросс-покупка) ― это покупка, совершенная на одной платформе, а затем появляющаяся в вашей библиотеке на другой. Ее близкий родственник ― BOPA (Buy Once Play Anywhere: один раз купил ― играй где угодно), но об этом мы еще поговорим позже.
Совет №2: Создайте собственный онлайн-домен
Когда вы выпускаете игру на разных платформах, вам становятся доступны специальные вспомогательные сервисы каждой из платформ, и они действительно удобны.
Если вы хотите сделать кроссплатформенную игру, к сожалению, вы не можете использовать большинство из этих сервисов, потому что статистика в Steam, например, не совпадает со статистикой в Xbox или PlayStation. Вы должны завести свой набор сервисов: статистики, системы идентификации, матчмейкинга и прочего, ― который будет связывать воедино данные от различных платформ.
Итак, что вам понадобится в первую очередь?
Совет №3: Узнайте больше о своих игроках
Допустим, у игрока есть:
Тут на помощь приходит так называемая система привязки учетных записей.
Привязка учетных записей позволяет связать вашу общую учетную запись с учетными записями различных платформ.
Если вы играете в Call of Duty, то наверняка знаете, что последняя часть франшизы является кроссплатформенной. И если вы захотите найти своего друга в системе, вам понадобится использовать Activision ID. Так, если вы играете на Xbox, вы не сможете найти своих друзей, играющих на PlayStation, потому что две эти базы игроков не пересекаются ― но в то же время данные обо всех игроках обеих платформ хранятся в Activision ID.
Эта единая система идентификации станет фундаментальной частью не только для текущей игры, но и для всех ваших будущих проектов. Именно она связывает вас с другими платформами.
Вот еще один совет. Внимательно отнеситесь к требованиям GDPR и CCPA: их нормативы необходимо принять во внимание еще на ранней стадии, дабы избежать неприятных последствий. Вдобавок, рано или поздно начнут появляться новые платформы, вы же хотите иметь возможность добавлять их к своей игре по мере появления?
Ниже показан один из примеров того, как реализовать привязку аккаунта к Steam.
Таким образом, система идентификации нужна для того, чтобы обменять токен Steam на свой собственный. Затем игрок может использовать этот токен для активации необходимых ему служб.
Совет №4: Пусть пользователи играют вместе
Теперь, когда вы успешно идентифицировали своих игроков при помощи системы привязки учетных записей, следующий шаг ― заставить пользователей играть вместе.
Итак, пришло время для кроссплея.
Для того, чтобы вы могли подключить игроков к одной мультиплеерной сессии со всеми их друзьями, вам нужно организовать систему матчмейкинга, управление игровыми сессиями и еще ряд сервисов ― полный список зависит от нужд конкретной игры. Таким образом, сначала вы идентифицируете пользователей и сводите их вместе вне зависимости от платформы, на которой они играют, а затем матчмейкинг организовывает их в игровые сессии.
Несколько заметок о мультиплеере и качестве соединения.
Если вы сами выбираете игровой движок, берите более дружественный к кроссплатформенности: в таких движках уже есть встроенный механизм для выполнения синхронизации клиент-сервер. Если же вы решите создать свой собственный движок, конечно, вы вправе это сделать, но имейте в виду следующее.
Когда вы захотите, чтобы ваши пользователи начали подключаться к другим игрокам, лучше не используйте прямой маршрут P2P. При учете, что вы не можете использовать встроенные библиотеки платформ вроде Xbox Secure Device Associations, такая задачка становится довольно запутанной, особенно когда мы говорим о подключении консоли к ПК. Совет: используйте либо выделенный сервер, либо одноранговый сервер ретрансляции для создания вашей сетки.
И последнее: поскольку вы теперь имеете дело с платформами разных мощностей ― ПК, консоли, ― пусть ваши симуляции используют фиксированную частоту 30 кадров в секунду. Рендеринг при этом можно оставить, как есть.
Совет №5: Позвольте игрокам продолжить игру на другой платформе
Как и многие другие, автор провел сотни часов в «Ведьмаке 3»: сначала играл на PlayStation, затем решил переключиться на Switch, из-за чего пришлось начинать все сначала, потому что в «Ведьмаке» нет возможности продолжить игру на другой платформе. Со временем разработчики все же организовали кросс-сохранение между Steam и Switch. Правда, речь-то здесь шла о PlayStation 4. Впрочем, вполне вероятно, что рано или поздно CD Projekt RED настроят кроссплатформенность и между ними ― главное, что уже задано правильное направление.
Как хранить данные ― целиком и полностью ваш выбор: можете хранить их в облаке в виде BLOB-объектов, можете в виде статистики, можете в виде строки в атрибутах профиля. Главное ― достигнуть цели в определении, что вы ― это все еще вы вне зависимости от того, играете вы на Switch, PlayStation или ПК.
Также, говоря о кроссплатформенности, нельзя не упомянуть о SPOP и MPOP.
SPOP (single point of presence) означает единственную точку присутствия, когда вы разрешаете только одно подключение к учетной записи в любой момент времени, и вход в игру на одной платформе означает автоматический выход из нее на другой. Таким образом SPOP может защитить вас от одновременного появления в одном и том же месте с различных платформ. Это самый простой и безопасный способ реализации, который позволяет избежать застопоривания данных.
MPOP (multiple points of presence) представляет собой совсем другой способ поведения. Он позволяет иметь несколько соединений, которые логически указывают на одну и ту же учетную запись. Организовать его бывает очень сложно, так как при MPOP должна создаваться гостевая учетная запись в случае, когда пользователи входят в одну и ту же учетную запись одновременно, что может вызвать проблемы с обеспечением правильного сохранения прогресса.
И хотя в большинстве ситуаций оказывается удобнее использовать SPOP, вы должны сами тщательно рассмотреть преимущества и недостатки того или иного способа для своей игры.
Совет №6: Унифицируйте свою коммерцию
Давайте поговорим о разнице между основным и вспомогательным магазином.
Основной магазин ― это стор, который вы должны настроить со стороны платформы, где происходят операции с реальными деньгами, в то время как вспомогательный ― это тот, который вы контролируете в игре.
Основной магазин сначала нужно настроить на каждой отдельной платформе, а затем перейти в различные регионы, что представляет собой уже довольно сложную задачу ― тем более, что у кроссплатформенной игры нет никакого API, чтобы сделать это. Это кропотливый ручной процесс, который вам нужно провести для каждой отдельной платформы. Поэтому лучше организовать основной магазин максимально просто, а уже внутриигровой обустроить так, как вы захотите.
Выше представлен пример работы системы сторов, где игроки могут совершать покупки в Steam, а безопасность этих покупок обеспечивает единая система электронной коммерции.
Далее приведена схема покупки в Steam.
Совет №7: Остерегайтесь дополнительных сертификационных требований для кроссплатформенных систем
В вашей жизни гарантированы три вещи:
Рекомендация: создайте себе подушку безопасности, чтобы успеть понять, что вам потребуется для успешного прохождения сертификации, и принятия соответствующих мер.
Совет №8: Разделите релиз и деплой
В Fortnite есть временное событие, переносящее героев из первого сезона во второй: согласно сюжету, весь мир внезапно начал разрушаться и поглощаться черной дырой.
Интересно то, что это событие никак не связано с активацией обновления. Когда вы выпускаете игровое обновление, вы не можете синхронизировать его с изменениями конфигурации на всех платформах, это очень трудоемкий процесс: нужно обратиться к аккаунт-менеджеру, пройти процесс сертификации и сделать множество других вещей.
Но это не единственный способ, при помощи которого вы можете внести в игру изменения.
Игровые изменения обычно вносятся посредством:
На схеме выше показано, как можно устроить систему реагирования игровых клиентов и серверов на изменение переменных на сервере. Push-уведомления в данном случае бывают довольно удобны, но не обязательны, вместо них можно просто пользоваться пуллами.
Совет №9: Один раз купил, играй где угодно (BOPA)
Внимание: далее идет неизведанная территория, и за абсолютную точность данных автор ручаться не может.
BOPA (Buy Once Play Anywhere) позволяет пользователям покупать игру на одной платформе так, чтобы затем она появилась в их покупках на любых других платформах.
Игрокам теперь не нужно беспокоиться о том, какие платформы покупать ― они могут просто купить игру. Для разработчиков игр польза заключается в том, что они могут собрать своих игроков в одну базу, расширить свой бренд и привлечь трафик в свой магазин.
Перечислим три элемента, необходимых BOPA:
Приведем примеры реализации BOPA.
Сценарий 1: после покупки в вашем магазине игра появляется в библиотеке Steam.
Примечание: задействуемый здесь API не доступен публично, поэтому вам нужно поговорить с вашим аккаунт-менеджером.
Сценарий 2: при покупке в Steam игра появляется в вашем магазине.
В данном случае вы не сможете отследить процесс покупки в Steam, поэтому вам придется положиться в этом на игрока.
Кроссплатформенность идеально подходит для игр с долгосрочным планом поддержки проекта. Как вы наверняка уже поняли, создание таких игр весьма нетривиально: вам понадобится большая команда, много времени и денег, чтобы иметь надлежащую инфраструктуру для ее поддержки.
С чего стоит начать?
Так же, как и в случае игровые движков, здесь существуют различные решения, которые вы можете использовать для реализации кроссплатформенности, поэтому нет необходимости создавать их с нуля ― конечно, если вы этого не захотите сами. Некоторые из них: GameSparks, Photon, AccelByte, PlayFab.
У каждого есть свои плюсы и минусы ― зависит от того, что вам нужно. Они могут различаться по: