Как создать игру как world of tanks

Обновлено: 05.07.2024

image

Эта история началась более трех лет назад. Наша небольшая компания DAVA стала частью Wargaming, и мы начали обдумывать, какие проекты делать дальше. Чтобы напомнить, каким был мобайл три года назад, скажу, что тогда не было ни Clash Of Clans, ни Puzzle & Dragons, ни многих очень известных сегодня проектов. Mid-core тогда только-только начинался. Рынок был в разы меньше сегодняшнего.

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

Тогда в разработке у нас находилось несколько игр. Одна из них носила рабочее название «Sniper». Основной геймплей-идеей была стрельба в снайперском режиме из стоящего в обороне танка, по другим танкам, которыми управлял AI и которые могли атаковать в ответ.

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

С этого все и началось!

Когда мы начинали разработку “Снайпера”, то рассматривали технологии, которые тогда были доступны для мобильных платформ. На тот момент Unity был еще на достаточно ранней стадии своего развития: по сути, необходимых нам технологий еще не было.

Основной вещью, которой нам не хватало, был рендеринг ландшафта c динамической детализацией, что является жизненно необходимым для создания игры с открытыми пространствами. Было несколько сторонних библиотек для Unity, однако их качество оставляло желать лучшего.

В итоге, мы решили дорабатывать свой движок!

Он на тот момент уже использовался в наших предыдущих казуальных проектах. Движок имел достаточно хорошо написанный низкий уровень работы с платформами и поддерживал iOS, PC, Mac, плюс были начаты работы по Android. Было написано много функциональности для создания 2D-игр. То есть, был неплохой UI и много всего для работы с 2D. В нем были первые шаги по 3D-части, так как одна из наших игр была полностью трехмерной.

Что у нас было в 3D-части движка:

  • Простейший граф сцены.
  • Возможность рисования статических мешей.
  • Возможность рисования анимированных мешей со скелетной анимацией.
  • Экспорт объектов и анимаций из Collada-формата.
Начало работ

Началось все с доказательства возможности отрисовать ландшафт на мобильных устройствах: тогда это были iPhone 4 и iPad 1.

После нескольких дней работы мы получили вполне функциональный динамический ландшафт, который работал довольно сносно, требовал где-то 8MB памяти и давал 60fps на этих устройствах. После этого мы начали полноценную разработку игры.

Прошло около полугода, и маленький мини-проект превратился в то, чем сейчас является Blitz. Появились совершенно новые требования: MMO, AAA-качество и другие требования, которые движок в его изначальном виде на тот момент уже не мог обеспечить. Но работа кипела полным ходом. Игра работала и работала неплохо. Однако производительность была средней, объектов на картах было мало, и, собственно, было множество других ограничений.

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

Как все работало на тот момент

Вся отрисовка сцен была основана на простой концепции Scene Graph.

Основной концепции являлись два класса:

  • Scene — контейнер сцены, внутри которого происходили все действия
  • над сценой.
  • SceneNode — базовый класс узла сцены, от которого наследовались все классы, которые находились в сцене:
  • MeshInstanceNode — класс для отрисовки мешей.
  • LodNode — класс для переключения лодов.
  • SwitchNode — класс для переключения свитч объектов.
  • еще около 15-ти классов наследников SceneNode.
  • Update — функция которая вызывалась для каждого узла, для того чтобы сделать Update-сцены.
  • Draw — функция, которая вызывалась для каждого узла, для того чтобы отрисовать этот узел.
  • Когда количество нодов в уровне достигло 5000, оказалось что просто пройти по всем пустым функциям Update, занимает около 3ms.
  • Аналогичное время уходило на пустые ноды, которым не требовалось Draw.
  • Огромное количество кэш-миссов, так как работа всегда велась с разнотипными данными.
  • Невозможность распараллелить работу на несколько ядер.
  • Изменение кода в базовых классах влияло на всю систему целиком, то есть каждое изменение SceneNode::Update могло сломать что угодно и где угодно. Зависимости становились все сложнее и сложнее, и каждое изменение внутри движка почти гарантированно требовало тестирования всей связанной функциональности.
  • Невозможно было сделать локальное изменение, например, в трансформациях, чтобы не задеть остальные части сцены. Очень часто малейшие изменения в LodNode (узел для переключения лодов), ломали что-то в игре.
Первые шаги по улучшению ситуации

Для начала мы решили полечить проблемы с производительностью и сделать это быстро.

Собственно, сделали мы это, введя дополнительный флаг NEED_UPDATE в каждой ноде. Он определял, нужно ли такой ноде вызывать Update. Это действительно повысило производительность, но создало целый ворох проблем. Фактически код функции Update выглядел вот так:


Это вернуло нам часть производительности, однако началось много логических проблем там, где их не ждали.

LodNode, и SwitchNode — ноды, отвечающие, соответственно, за переключение лодов (по расстоянию) и переключение объектов (например, разрушенных и неразрушенных) — начали регулярно ломаться.

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

Самым первым шагом было заложить архитектуру, которая позволит в перспективе решить все возникающие у нас проблемы.

  • Минимизация зависимости между независимыми подсистемами.
  • Изменения в трансформациях не должны ломать систему лодов, и наоборот
  • Возможность положить код на многоядерность.
  • Чтобы не было функций Update или аналогичных, в которых выполнялся разнородный независимый код. Легкая расширяемость системы новой функциональностью без полного перетестирования старой. Изменения в одних подсистемах не влияет на другие. Максимальная независимость подсистем.
  • Возможность расположить данные линейно в памяти для максимальной производительности.
Комбинирование компонентного и data-driven-подхода

Решением этой проблемы стал компонентный подход, комбинированный c data-driven подходом. Дальше по тексту я буду употреблять data-driven-подход, так как не нашел удачного перевода.

Вообще понимание компонентного подхода у многих людей самое разное. То же — и с data-driven.

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

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

Что же такое data-driven. В моем понимании, это подход к проектированию программного обеспечения, когда за основу потока выполнения программы берутся данные, а не логика.

На нашем примере представим следующую иерархию классов:


Код обхода этой иерархии иерархически выглядит так:


В данной иерархии C++ наследования мы имеем три различных независимых потока данных:

Давайте представим, как это должно выглядеть в data-driven подходе. Напишу на псевдокоде, чтобы была понятна идея:


По сути, мы развернули циклы работы программы, сделав это таким образом, чтобы все отталкивалось от данных.

Данные в data-driven подходе являются ключевым элементом программы. Логика — лишь механизмы обработки данных.

Новая архитектура

В какой-то момент стало понятно, что надо идти в сторону Entity-based подхода к организации сцены, где Entity являлась сущностью, состоящей из многих независимых компонентов. Хотелось, чтобы компоненты были полностью произвольными и легко комбинировались между собой.

Читая информацию по этой теме, я наткнулся на блог T-Machine.

• Entity не содержит никакой логики, это просто ID (или указатель).
• Entity знает только ID компоненты, которые ей принадлежат (или указатель).
• Компонент — это только данные, то есть. компонент не содержит никакой логики.
• Система — это код, который умеет обрабатывать определенный набор данных и выдавать на выходе другой набор данных.

Когда я понял это, в процессе дальнейшего изучения различной информации наткнулся на Artemis Framework и увидел хорошую реализацию этого подхода.
Исходники тут, если предыдущий линк не работает: Artemis Original Java Source Code

Если вы разрабатываете на Java, то очень рекомендую посмотреть на него. Очень простой и концептуально правильный Framework. На сегодняшний день он спортирован на кучу языков.

То, чем является Artemis, сегодня называют ECS (Entity Component System). Вариантов организации сцены на базе Entity, компонентов и data-driven достаточно много, однако мы по итогу пришли к архитектуре ECS. Сложно сказать, насколько это общепринятый термин, однако ECS значит, что есть следующие сущности: Entity, Component, System.

Самое главное отличие от других подходов это: Обязательное отсутствие логики поведения в компонентах, и отделение кода в системы.

Этот пункт очень важен в “православном” компонентном подходе. Если нарушить первый принцип, появится очень много соблазнов. Один из первых — сделать наследование компонентов.

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

image

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

ECS — более чистый подход, и решает больше проблем.

Чтобы посмотреть на примере, как это работает в Artemis, можете глянуть вот тут.

Я на примере покажу, как это работает у нас.

Главным классом контейнером является Entity. Это класс, который содержит массив компонентов.

Вторым классом является Component. В нашем случае, это просто данные.

Вот список компонентов, используемых у нас в движке, на сегодняшний день:


Третим классом является SceneSystem:


Функции RegisterEntity, UnregisterEntity вызываются для всех систем в сцене тогда, когда мы добавляем или удаляем Entity из сцены.


Функции RegisterComponent, UnregisterComponent вызываются для всех систем в сцене, тогда, когда мы добавляем или удаляем Component в Entity в сцене.
Также для удобства есть еще две функции:


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

Например, мы можем заказать получение только тех Entities, у которых есть ACTION_COMPONENT и SOUND_COMPONENT. Передаю это в SetRequiredComponents и — вуаля.

Чтобы понять, как это работает, распишу на примерах, какие у нас есть системы:

  • TransformSystem — система которая отвечает за иерархию трансформаций.
  • SwitchSystem — система которая отвечает за переключения объектов, которые могут быть в нескольких состояниях, как например разрушенное и неразрушенное.
  • LodSystem — система которая отвечает за переключение лодов по расстоянию.
  • ParticleEffectSystem — система которая обновляет эффекты частиц.
  • RenderUpdateSystem — система которая обновляет рендер-объекты из графа сцены.
  • LightUpdateSystem — система которая обновляет источники света из графа сцены.
  • ActionUpdateSystem — система которая обновляет actions (действия).
  • SoundUpdateSystem — система которая обновляет звуки, их позицию и ориентацию.
  • UpdateSystem — система которая вызывает кастомные пользовательские апдейты.
  • StaticOcclusionSystem — система применения статического окклюжена.
  • StaticOcclusionBuildSystem — система построения статического окклюжена.
  • SpeedTreeUpdateSystem — система апдейта деревьев Speed Tree.
  • WindSystem — система расчета ветра.
  • WaveSystem — система расчета колебаний от взырвов.
  • FolliageSystem — система расчета растительности над ландшафтом.

В практически любой системе код выглядит следующим образом:


Системы можно классифицировать по тому как они обрабатывают объекты:

  • Требуется обработка всех объектов, которые находятся в системе:
    • Физика
    • Коллизии
    • Система трансформаций
    • Система actions (действий)
    • Система обработки звуков
    • Система обработки частиц
    • Static Occlusion System
    • Мы сильно повысили FPS, так как с компонентным подходом вещи стали более независимы и мы смогли их по отдельности развязать и оптимизировать.
    • Архитектура стала более простой и понятной.
    • Стало легко расширять движок, почти не ломая соседние системы.
    • Стало меньше багов из серии «сделав что-то c лодами, сломали свитчи», и наоборот
    • Появилась возможность это все распараллеливать на несколько ядер.
    • На текущий момент, уже работаем над тем, чтобы все системы запускать на всех доступных ядрах.

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

    Учитывайте тот факт, что все писалось в реальном проекте, и, конечно, это не академическая реализация.

    2. Сверить системные требования World of Tanks: Mercenaries со своим компьютером

    Найти требования World of Tanks: Mercenaries нетрудно, даже не имея глубоких познаний в устройстве компьютера, а вот понять, что в них написано, уже сложнее. В системных требованиях часто приведены названия конкретных моделей комплектующих. Каждая из них обладает целым рядом характеристик, и неподготовленному пользователю трудно в этом всем разобраться.

    Поэтому если есть сомнения в том, что компьютер “потянет” World of Tanks Console, лучше всего попросить помощи у друга или знакомого, который разбирается в этом вопросе.

    Если такого поблизости нет, то можно начать установку World of Tanks Console и так, без сверки с требованиями, но в таком случае никаких гарантий стабильной работы игры нет. Впрочем, ничего страшного с компьютером тоже не случится. В худшем случае World of Tanks Console просто не запустится.

    6. Начать играть в World of Tanks VR

    Имея готовый к запуску клиент World of Tanks VR и учетную запись, можно смело запускать ее! Дальше уже все зависит от того, как разработчики организовали вступительный этап игры, обучение и прочие аспекты введения в игру для новичков.

    Помните, что для запуска World of Tanks VR всегда нужно иметь актуальный клиент игры.

    Обновления могут устанавливаться разными способами:

    • В качестве скачиваемых патчей, которые нужно самостоятельно запускать и проходить несложную процедуру установки;
    • В виде автоматических загрузок в сервисе;
    • Через сам клиент игры.

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

    GUI в игре World of Tanks. Часть вторая: обзор структуры GUI и планы на будущее

    image

    Сегодня мы продолжаем начатый неделю назад рассказ об интерфейсе игры World of Tanks.

    Текущее состояние проекта

    Освежим информацию из первой части статьи.

    Сейчас для рендеринга GUI в проекте используется технология Autodesk Scaleform, которая позволяет использовать Flash как среду разработки.

    Кто знаком с Flash, тот знает, что языком программирования в этой среде является ActionScript. У этого языка есть несколько версий, но самые широко используемые — ActionScript2 (AS2) и ActionScript3 (AS3).
    В нашем проекте на текущий момент используются обе версии. Обусловлено это тем, что разработка начиналась на AS2, так как Scaleform на тот момент еще не поддерживал AS3. Со временем, когда поддержка AS3 в Scaleform появилась и ее реализация стала достаточно надежной, начался перевод сервисных (не боевых) интерфейсов на AS3.

    Почему переход на AS3 начался с миграции на него именно сервисных интерфейсов? Все очень просто. Бодрое танковое рубилово — это наше все. Любые помехи, лаги или баги в боевом интерфейсе могут испортить ощущения пользователя в процессе игры. На такой риск мы пойти не могли и начали миграцию с менее требовательной с точки зрения ресурсов и не такой критичной для игрового процесса части. Такой подход полностью себя оправдал. Мы наткнулись на проблемы с производительностью и потреблением памяти. Большую часть из них мы решили до релиза обновленного ангара, какие-то отлавливали и исправляли уже в продакшене, опираясь на баг-репорты от игроков. Обошлось без серьезных проколов, что не может не радовать.

    В предыдущей статье я приводил список проблем, с которыми нам приходилось жить в AS2. Освежу этот список:

    • проблемы с различными версиями кода в разных SWF-файлах;
    • проблема коммуникации Flash <—> Python;
    • отсутствие стандартизации и унификации в коде;
    • отсутствие четких правил и процедур по добавлению нового функционала;
    • отсутствие автоматизации сборки проекта.
    Обзор архитектуры и процесса разработки

    Но не Flash-ем единым живет GUI-разработчик WoT. В качестве скриптового языка в проекте используется Python. Всю красоту, которую мы сделали во Flash, нужно подключить в игре, наполнить данными, обработать и транслировать пользовательский ввод в реальные действия в игре. Все это как раз и делается в Python.

    Вот упрощенная схема основных элементов GUI в клиенте:

    image

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

    AS2 и его взаимодействие с Python

    При входе в бой начинается загрузка battle.swf. В этом файле содержатся практически все основные элементы боевого интерфейса (HUD): списки команд, чат, панель состояния танка, мини-карта, панель расходников и т. д.

    Практически за каждый элемент, присутствующий в battle.swf, отвечает один из классов в Battle.py. При завершении загрузки содержимое файла растягивается на весь viewport игрового клиента и отрисовывается поверх 3D-сцены. Кроме battle.swf также загружаются SWF-файлы для отображения маркеров и прицелов. Они помещаются под battle.swf для того, чтобы маркеры и прицелы не накладывались на элементы HUD, а прятались под ними.

    Также для систем с несколькими мониторами SWF-файлы с прицелами и маркерами растягиваются на все мониторы, а battle.swf отрисовывается только на главном мониторе (чтобы HUD не разлетелся по разным углам этих мониторов и осталась возможность адекватно читать боевую информацию).

    За состоянием маркеров и прицелов следит Python. В нем обрабатываются игровые события и данные, создаются и уничтожаются маркеры и прицелы. Для каждого типа прицелов есть свой Python-класс. За маркерами следит VehicleMarkersManager. За расположение маркеров и прицелов на экране отвечает клиентский C++ код.

    Для коммуникации Flash и Python в бою используются два подхода:

    1) Наиболее частый — передача данных массивом скалярных данных через API, предоставляемое в Scaleform. В предыдущей статье я описал этот метод и объяснял его недостатки (неудобно читать код, рефакторить и поддерживать).

    2) Второй подход — Direct Access API (DAAPI). О нем я только упоминал, а теперь расскажу подробнее.

    У этого подхода есть два основных преимущества: простота и скорость работы.

    Простота заключается в том, что передавать сложные объекты в обе стороны можно не думая о сериализации/десериализации — все происходит автоматически в C++. Скорость работы достигается за счет того, что вызовы методов в обе стороны происходят «напрямую». То есть, имея ссылку на Flash-объект в Python, можно вызвать его метод и передать в него аргументы так, как будто это Python-объект. Без использования DAAPI вызов методов происходит по указанию пути к Flash-объекту в дереве визуальных компонентов и поиску этого компонента в иерархии, что дорого.

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

    Нарисую и поясню, что происходит, по шагам.

    image

    • Во Flash создаем класс с объявлением публичных полей с типом Function. Значения этих полей не инициализируем, т. е. они == null.
    • В Python создаем класс с реализацией для этих методов. Именование методов должно совпадать с именованием полей во Flash-классе.
    • Создаем экземпляры этих классов во Flash и Python.
    • Передаем ссылку на Flash-экземпляр в Python.
    • Назначаем экземпляр Python-класса как обработчик для экземпляра Flash-класса (устанавливаем DAAPI соединение).
    • Вызываем метод из первого пункта во Flash-классе.
    • Благодаря DAAPI происходит вызов метода, реализованного в Python. Причем для Flash это выглядит как вызов обычного метода во Flash. В качестве параметров могут выступать как скалярные типы данных, так и сложные объекты.
    Как устроена AS3 часть проекта
    • Common — SWC-библиотека с набором общих файлов, используемых в проекте. Сюда входит:
      — библиотека Scaleform CLIK (набор UI-компонентов и менеджеров);
      — базовые классы и интерфейсы инфраструктурной части проекта;
      — код сторонних библиотек, используемых в проекте.
    • GUI — SWC-библиотека, в которой собран код всех вьюшек, окошек и других визуальных объектов.
    • App — содержит имплементации всех менеджеров и инфраструктурных классов. Сборка этого проекта дает на выходе application.swf.
    • создание и инициализация инфраструктурных частей проекта в AS3 (менеджеры, контейнеры для вьюшек и т. п.);
    • загрузка всех определений классов, используемых в приложении (это помогает решить проблему с динамической подгрузкой разных версий одного и того же класса, о которой я говорил в предыдущей статье);
    • загрузка и выгрузка ресурсов для вьюшек.
    • cоздание и инициализация инфраструктурных частей проекта в Python (все абсолютно симметрично первому пункту из AS3 части);
    • загрузка конфигурации, описывающей взаимосвязи между AS3 и Python частями проекта (подробнее об этом буквально через несколько абзацев);
    • инициализация DAAPI-соединения для самого Application и всех инфраструктурных классов.

    BattleResultsMeta.yaml


    После обработки этого YAML-файла в ходе сборки проекта сгенерируется следующий набор классов и интерфейсов:

    BattleResultsMeta — базовый Python-класс. В нем объявлен набор всех методов из python-секции YAML для их последующей перегрузки в классе-наследнике и набор методов из flash-секции, для возможности доступа к ним из Python по сигнатуре, объявленной в YAML.


    BattleResultsMeta — базовый AS3 класс. В нем объявлен набор всех методов из python-секции YAML, для возможности доступа к ним из Flash по сигнатуре, объявленной в YAML. Именно эти методы объявляются как поля с типом Function, и они будут заменены на Python-методы из предыдущего пункта, после установки DAAPI-соединения.


    IBattleResultsMeta — AS3 интерфейс. В нем объявлен набор всех методов из python- и flash-секций YAML. Класс, реализующий функциональность окна послебоевой статистики, должен реализовывать этот интерфейс.


    Теперь для интеграции нового окна в клиент нужно выполнить несколько шагов.

    • Создать FLA-файл, в котором будет содержаться визуальная часть окна.
    • Во Flash создать класс BattleResults, наследуемый от BattleResultsMeta и реализующий интерфейс IBattleResultsMeta.
    • В Python создать класс BattleResults, наследуемый от BattleResultsMeta.
    • В Python создать константу, используемую как уникальный идентификатор нового компонента.
    • Добавить конфигурационные данные в Python, где будет указано соответствие между:
      — уникальным идентификатором нового компонента,
      — типом нового компонента (в нашем случае это окно),
      — файлом с визуальным представлением,
      — Python-классом, отвечающим за новый компонент.

    Танцы с бубном закончены. Чтобы показать новое окно в клиенте, достаточно у Python-части нашего Application вызвать метод loadView, в который передается уникальный идентификатор нового компонента.

    Что происходит, после того как мы вызвали загрузку нашего окна

    Вот упрощенный алгоритм работы по загрузке и инициализации модуля (голубым цветом отмечены шаги в Python, розовым — во Flash):

    image

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

    • управление загрузкой SWF-файлов;
    • управление распределением вьюшек по слоям и управление перехода фокуса между ними;
    • управление тултипами;
    • работа с локализационными строками;
    • управление звуковыми событиями;
    • управление контекстными меню;
    • управление анимацией;
    • управление и работа с цветовыми схемами;
    • другие задачи.
    Планы на будущее

    Самая объемная задача на обозримое будущее — перевод HUD на AS3. В текущий момент мы ведем исследования и готовим проект к такому переходу. Главное, чего мы хотим добиться в рамках этого перехода, — унифицировать механизмы добавления и разработки новой функциональности и избавиться от того разнообразия подходов, которое есть сейчас.

    Мы также хотим как минимум не ухудшить производительность и потребление памяти новым HUD, а в лучшем случае — добиться прироста производительности и уменьшения объемов памяти, требуемых для работы HUD.

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

    Самое узкое место — взаимодействие с отделом User Experience (UX). Сейчас при проработке новых игровых концепций или новой функциональности часто необходимо создать прототип, на базе которого можно (до передачи задачи в разработку) оценить удобство или простоту понимания основных механик простыми игроками.

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

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

    Для решения этой проблемы мы планируем:

    • создать набор стандартных компонентов (кнопки, индикаторы, списки и т. п.);

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

    • создать инструменты быстрого прототипирования.

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

    Вот и все, что я хотел и мог рассказать вам о GUI в World of Tanks. Задавайте вопросы в комментариях. Спасибо за внимание.

    1. Узнать системные требования World of Tanks Console

    Для того, чтобы запустить и комфортно играть в World of Tanks: Mercenaries, необходимо удостовериться, что имеющийся под рукой компьютер соответствует системным требованиям этой игры.

    Системные требования почти всегда можно найти на официальном сайте.

    Минимальные требования обозначают такую конфигурацию компьютера, на которой World of Tanks Console запустится. В нее можно будет играть, но только на низких настройках графики и, скорее всего, с “тормозами”.

    Рекомендуемые — совсем другое дело. Имея такой компьютер, который описан в рекомендуемых требованиях, можно сказать, что World of Tanks: Mercenaries на нем запустится и будет плавно работать без проблем с производительностью.

    Узнать системные требования World of Tanks Console

    2. Сверить системные требования World of Tanks VR со своим компьютером

    Найти требования World of Tanks VR нетрудно, даже не имея глубоких познаний в устройстве компьютера, а вот понять, что в них написано, уже сложнее. В системных требованиях часто приведены названия конкретных моделей комплектующих. Каждая из них обладает целым рядом характеристик, и неподготовленному пользователю трудно в этом всем разобраться.

    Поэтому если есть сомнения в том, что компьютер “потянет” World of Tanks VR, лучше всего попросить помощи у друга или знакомого, который разбирается в этом вопросе.

    Если такого поблизости нет, то можно начать установку World of Tanks VR и так, без сверки с требованиями, но в таком случае никаких гарантий стабильной работы игры нет. Впрочем, ничего страшного с компьютером тоже не случится. В худшем случае World of Tanks VR просто не запустится.

    Решение проблем в World of Tanks VR

    Даже если все сделано правильно, с игрой могут возникнуть технические проблемы: World of Tanks VR не запускается, вылетает, тормозит. Черный экран, отсутствие звука, не работает управление — все это тоже иногда встречается. Как в таком случае действовать?

    Многие проблемы можно решить банальной переустановкой клиента. Для этого нужно сначала удалить игру, а затем поставить ее заново. Если же это не помогло, то есть попробовать другие методы, но тогда лучше всего воспользоваться нашим специальным руководством по решению проблем в World of Tanks VR.

    4. Перейти на сайт World of Tanks Console и зарегистрироваться

    Чтобы бесплатно играть в World of Tanks Console, необходимо создать свою учетную запись, если игра использует собственную систему учетных записей. Для этого нужно перейти на официальный сайт и зарегистрироваться.

    При регистрации обычно нужно указать следующие учетные данные:

    • Адрес электронной почты;
    • Логин в игре (никнейм);
    • Пароль (лучше всего придумывать новый для каждой новой игры);
    • Дату рождения;
    • Секретный вопрос — он нужен для того, чтобы усложнить процесс взлома для злоумышленников, а также для восстановления собственного доступа к учетной записи в случае утраты пароля.

    Процесс регистрации в игре иногда может проходить в самом клиенте, в таком случае можно сразу перейти к следующему пункту.

    Официальный сайт World of Tanks Console

    Вне зависимости от того, как устроена регистрация учетной записи, для запуска World of Tanks Console нужно получить дистрибутив игры. Как правило, его можно скачать на официальном сайте, но может быть и так, что World of Tanks: Mercenaries распространяется через один из игровых сервисов:

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

    Если World of Tanks Console представлена в одном из таких сервисов, то для скачивания клиента нужно будет также зарегистрироваться в сервисе. Этот процесс проходит в том же ключе, что и при регистрации на сайте игры: нужно указать логин, пароль и другие данные.

    World of Tanks Console → Как играть бесплатно

    Играть в World of Tanks Console (World of Tanks: Наемники) бесплатно - где лучше скачать, как установить и запустить клиент и как создать аккаунт в игре

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

    Что такое World of Tanks: Mercenaries

    3. Зарегистрировать электронную почту

    Очень многие бесплатные клиентские игры используют систему учетных записей для идентификации пользователей. Если World of Tanks VR одна из таких и у вас до сих пор нет собственной электронной почтой, то перед тем, как переходить к следующему этапу, нужно обзавестись собственным электронным адресом.

    В сети много разных почтовых служб, все они бесплатны, но особенно надежными считаются вот эти:

    Разумеется, проходить этот этап не нужно, если у вас уже есть электронная почта. Конечно, можно зарегистрировать еще одну, но для игры в World of Tanks VR сгодится и та, что была заведена ранее.

    3. Зарегистрировать электронную почту

    Очень многие бесплатные клиентские игры используют систему учетных записей для идентификации пользователей. Если World of Tanks: Mercenaries одна из таких и у вас до сих пор нет собственной электронной почтой, то перед тем, как переходить к следующему этапу, нужно обзавестись собственным электронным адресом.

    В сети много разных почтовых служб, все они бесплатны, но особенно надежными считаются вот эти:

    Разумеется, проходить этот этап не нужно, если у вас уже есть электронная почта. Конечно, можно зарегистрировать еще одну, но для игры в World of Tanks Console сгодится и та, что была заведена ранее.

    Как создать аккаунт в World of Tanks Console

    6. Начать играть в World of Tanks: Mercenaries

    Имея готовый к запуску клиент World of Tanks Console и учетную запись, можно смело запускать ее! Дальше уже все зависит от того, как разработчики организовали вступительный этап игры, обучение и прочие аспекты введения в игру для новичков.

    Помните, что для запуска World of Tanks Console всегда нужно иметь актуальный клиент игры.

    Обновления могут устанавливаться разными способами:

    • В качестве скачиваемых патчей, которые нужно самостоятельно запускать и проходить несложную процедуру установки;
    • В виде автоматических загрузок в сервисе;
    • Через сам клиент игры.

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

    Как скачать World of Tanks: Mercenaries

    Решение проблем в World of Tanks Console

    Даже если все сделано правильно, с игрой могут возникнуть технические проблемы: World of Tanks Console не запускается, вылетает, тормозит. Черный экран, отсутствие звука, не работает управление — все это тоже иногда встречается. Как в таком случае действовать?

    Многие проблемы можно решить банальной переустановкой клиента. Для этого нужно сначала удалить игру, а затем поставить ее заново. Если же это не помогло, то есть попробовать другие методы, но тогда лучше всего воспользоваться нашим специальным руководством по решению проблем в World of Tanks Console.

    4. Перейти на сайт World of Tanks VR и зарегистрироваться

    Чтобы бесплатно играть в World of Tanks VR, необходимо создать свою учетную запись, если игра использует собственную систему учетных записей. Для этого нужно перейти на официальный сайт и зарегистрироваться.

    При регистрации обычно нужно указать следующие учетные данные:

    • Адрес электронной почты;
    • Логин в игре (никнейм);
    • Пароль (лучше всего придумывать новый для каждой новой игры);
    • Дату рождения;
    • Секретный вопрос — он нужен для того, чтобы усложнить процесс взлома для злоумышленников, а также для восстановления собственного доступа к учетной записи в случае утраты пароля.

    Процесс регистрации в игре иногда может проходить в самом клиенте, в таком случае можно сразу перейти к следующему пункту.

    Вне зависимости от того, как устроена регистрация учетной записи, для запуска World of Tanks VR нужно получить дистрибутив игры. Как правило, его можно скачать на официальном сайте, но может быть и так, что World of Tanks VR распространяется через один из игровых сервисов:

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

    Если World of Tanks VR представлена в одном из таких сервисов, то для скачивания клиента нужно будет также зарегистрироваться в сервисе. Этот процесс проходит в том же ключе, что и при регистрации на сайте игры: нужно указать логин, пароль и другие данные.

    World of Tanks VR → Как играть бесплатно

    Играть в World of Tanks VR бесплатно - где лучше скачать, как установить и запустить клиент и как создать аккаунт в игре

    World of Tanks VR — специальная версия соревновательного танкового симулятора для устройств виртуальной реальности HTC Vive. Одной из самых привлекательных черт игры является масштабность сражений, где в главной роли выступают танки. По мере того, как растет ваш опыт и статус, ваш железный друг тоже растет. От небольшого и довольно слабого танка, до огромного монстра, которому уже ничего не страшно. Неспешно, но уверенно, игроки двигаются по полю, чтобы разнести друг-друга и победить в сражении. В этой игре также важна тактика, важно занять правильные позиции. Они зависят от класса вашего танка. Например машины артиллерии могут засесть где-то в укромном месте и стрелять оттуда по врагу. Легкие танки будут быстрее всех передвигаться по карте и помогать в поисках противника. Самые же мощные танки просто пойдут в лобовую атаку.

    Что такое World of Tanks VR

    Как бесплатно играть в World of Tanks VR

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

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

    Как бесплатно играть в World of Tanks VR

    Как бесплатно играть в World of Tanks Console

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

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

    Как бесплатно играть в World of Tanks Console

    1. Узнать системные требования World of Tanks VR

    Для того, чтобы запустить и комфортно играть в World of Tanks VR, необходимо удостовериться, что имеющийся под рукой компьютер соответствует системным требованиям этой игры.

    Системные требования почти всегда можно найти на официальном сайте.

    Минимальные требования обозначают такую конфигурацию компьютера, на которой World of Tanks VR запустится. В нее можно будет играть, но только на низких настройках графики и, скорее всего, с “тормозами”.

    Рекомендуемые — совсем другое дело. Имея такой компьютер, который описан в рекомендуемых требованиях, можно сказать, что World of Tanks VR на нем запустится и будет плавно работать без проблем с производительностью.

    Узнать системные требования World of Tanks VR

    Читайте также: