Defold. CI и фичи движка о которых стоит знать.

Так вышло, что при подготовке к первому в моей жизни докладу на DevGAMM я написал его полную текстовую версию.

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

Задачи

  1. Гейм-дизайнер, а у нас в команде он по совместительству и художник, хочет иметь возможность проверять результат своей работы в билде. И очень хотелось бы смотреть именно на телефоне.
    • С точки зрения геймдизайна это удобно, потому как можно проверить и настроить управление.
    • С точки зрения графики: партиклы или другие элементы смотрятся хорошо на экране компьютера, а на телефоне смотрятся невыразительно.
    • С точки зрения UX: “нажимаемость” кнопок, удобство «дотягивания пальцем» и т.п.
  2. Нужен простой и удобный способ создания и поддержки нативных расширений. Плагины обновляются, меняется api и не всегда есть возможность ждать, пока автор актуализирует свое расширение. А держать окружение под каждую платформу и возиться с компиляторами не хочется.
  3. Допустим, мы разработали или накачали плагинов, а как дальше с этим жить и работать? Дизайнер хочет дальше дизайнить игру, а программист писать код. Нам нужно вносить изменения, собирать билды для тестирования и все еще хочется делать это быстро и безболезненно. Очень часто большое количество sdk в билде всему этому очень мешают.
  4. Что если из-за изменения в игре нужно пересобрать билды сразу под все платформы? Или собрать билд и быстро залить его на несколько устройств для тестирования? Тут нам и пригодится билд сервер.

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

Мы выбрали Defold и нам повезло, что эти проблемы  решаются “из коробки”.

Быстрое итерирование

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

В Defold ресурсы и runtime движка разделены. Есть плеер, который уже скомпилирован под все платформы и есть ресурсы, которые в этом плеере проигрываются. Причем к ресурсам относится не только графика, звуки, модели и т.п., но и код игровой логики, написанный на lua.

Поэтому сам процесс билда — это подготовка и упаковка ресурсов + добавление рантайма (dmengine) под нужную платформу. В результате мы имеем процесс сборки билда меньше одной минуты.

Но и это еще не все. У runtime есть специальная версия dmengine для debug, которую можно установить отдельно от игры. Запустив его на устройстве, в редакторе появляется опция запуска игры по wifi прямо на это устройство. И это происходит практически моментально.

Разработчик просто скачивает APK dmengine и устанавливает на свой телефон. Запускает приложение. Оно находит в сети ваш редактор и в нем появляется опция запуска игры прямо на телефон. Остается только запустить билд и через несколько секунд он уже работает на телефоне.

Таким образом, дизайнер может делать хоть сотню проверок в день прямо на телефоне и не дожидаться пока кто-то соберет ему билд.

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

Создание Native Extensions

От проблем дизайнеров перейдем к проблемам программистов.

В любом проекте есть потребность использовать нативные библиотеки. Это могут быть как нативные функции устройства (например, вибро или taptic engine), так и сторонние сервисы (например,рекламные сети или аналитика).

Рано или поздно случается так, что вам приходится что-то поменять в готовом расширении (например, обновить API) или написать свое расширение.

В Defold для этого существует cloud build.

Процесс написания расширения выглядит просто:

  1. открываем любимую ide или блокнот;
  2. пишем код на C++, Java или ObjectiveC (в зависимости от платформы);
  3. складываем нативный код в папки с определенной структурой;
  4. нажимаем билд в редакторе Defold.

Если что-то пошло не так и возникли ошибки компиляции, то сообщения об этом появятся прямо в редакторе.

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

Коротко об устройстве самих расширений.

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

Кроме того, из  С++ доступен ряд методов Defold SDK — это API для работы с движком. Не смотря на то, что это альфа версия, там уже есть много вкусного.
На данный момент, нативные расширения поддерживаются для ios, macOS, android. Уже анонсирована поддержка html5. Я уверен, что скоро подтянутся и остальные платформы.

Интеграция SDK и плагинов

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

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

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

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

Более того, этот кастомный dmengine с вашими плагинами можно собрать и под ios, для этого понадобится mac, provision с прописанными UDID устройств и 2 клика в редакторе Defold. После чего подписанный ipa появится в дашборде Defold и будет доступен всем разработчикам из вашей команды.

Это непривычно и проще разобрать на примере, вот представьте…

Я говорю дизайнеру, что встроил рекламу и аналитику и ему нужно обновить dmengine. Он со своего тестового iPhone идет в dashboard Defold  и скачивает обновленный ipa. После чего он дальше продолжает работу на своем windows компьютере, тестируя игру на iPhone. Ему для этого нужно просто нажать на 2 ссылки в браузере и все.

Билд сервер

В ситуации, когда билд собирается за минуту — две, а тестировать игру можно вообще не собирая, возникают сомнения в необходимости билд сервера.

Но если у вас команда побольше или, к примеру, вам нужно пересобрать билды под множество платформ, то для этого есть специальная консольная утилита bob.jar. Используя её, можно смастерить свой билд сервер. Bob умеет все то же самое, что умеет редактор по части сборки билдов только в командной строке.

Также разработчики движка поделились скриптом на bash с примером такой автоматизации. Его можно доработать под свои нужды.

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


P.S. Я очень благодарен организаторам конференции DevGAMM за возможность выступить с докладом и Олегу Придюку, за то, что помог на это решиться =)

Буду рад любым вопросам и комментариям.

  • Богдан

    Круто 🙂

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

  • Отлично всё расписал, я вот прям подумаю для 2д игры про Defold. (:

    • Круто! Расскажи потом о своем опыте, если руки дойдут попробовать.
      Будут вопросы — спрашивай, буду рад помочь.

  • Есть ли возможность дебажить нативный код плагинов, как в Юнити?

    • На данный момент нет, но судя по тому что это отмечено как known issue, то сделают после того как добавят поддержку всех платформ.

  • Pingback: Ваши впечатления о DevGAMM Moscow 2017 | DevGAMM Moscow 2017()