Отчет о Haxe Summit 2017

Всем привет!

В прошлое воскресенье вернулся с Haxe Summit 2017, который проходил с 13 по 16 сентября в Амстердаме. Решил сделать здесь краткий отчет о мероприятии (тем более, что на работе также нужно писать отчет о поездке :)

Напишу не обо всех докладах, которые прослушал, а только о наиболее интересных мне (и не по порядку).

Вылетели мы рано утром 13 сентября и, к сожалению, не успели на доклад Haxe.getState(), в котором Николас описал историю языка и текущее состояние Haxe Foundation. Было анонсировано партнерство c Docler Holding.

Heaps

    На следующий день (в четверг) Николас провел семинар о технологиях, используемых в игре Northgard, в основном о движке Heaps (https://github.com/HeapsIO/heaps), а также о БД CastleDB (http://castledb.org/).

cube.jpg

    Heaps - это кроссплатформенный 3D, 2D игровой движок. В данный момент собирается под html5 (js webgl), desktop (с sdl, directx), консолях (пока что только на Sony PS4; поддержка XBox One и Nintendo Switch также находится в работе) и flash (но это, к сожалению, уже история). API движка похож на flash, но в отличие от OpenFL он не пытается реализовать все возможности flash, а также работает только с аппаратным ускорением графики (так что на Canvas он не запустится). Такой подход делает его более производительным и гибким.

    В Heaps есть свой display list, но, например, нет фильтров, вместо них объектам назначаются материалы (в том числе multipass). Весьма продвинутой фичей является способ работы с шейдерами: используется язык шейдеров hxsl, который, по сути, является Haxe кодом. Шейдеры пишутся в своих классах, а не строками, как в glsl; могут использовать наследование, что позволяет переопределить часть поведения шейдера, при этом не нужно целиком переписывать вершинный или фрагментный шейдер (меньше кода). Все это возможно благодаря магии макросов :)

    Также имеется система работы с игровыми ассетами, с разными вариантами их загрузки и выгрузки из памяти.

    В комплекте идет базовый набор UI компонентов. Вывод текста осуществляется с помощью bitmap font, при этом для разметки текста можно использовать html.

В ближайшем будущем Николас обещал открыть сайт с документацией проекта (пока что по адресу http://heaps.io/ висит заглушка). А пока движок можно поизучать по примерам из репозитория https://github.com/HeapsIO/heaps.

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

    Стоит также упомянуть, что авторы Heaps и Kha (о нем см. ниже) договорились о том, что Heaps сможет работать поверх Kha. Таким образом, на Heaps можно будет делать игры под все платформы, поддерживаемые Kha (Windows, Mac, Linux, iOS, Android, Windows Phone, HTML5, Flash, Raspberry Pi, Xbox One, PS4, Nintendo Switch, Unreal Engine).

    Игры сделанные на Heaps:

2017-09-17 08-16-46.JPG

    Наша команда так вдохновилась выступлением Николаса, что в тот же вечер мы начали писать на Heaps игру с советских игровых автоматов “Морской бой”: из картинок из интернета собрали графический макет игры (так как художников среди нас не было), частично написали логику, но не успели ее завершить (в ближайшее время планируем снова собраться и доделать ее).

control_room_2.png

    Что могу сказать из личного опыта: для нашего прототипа в движке все есть, код у него простой для понимания и при желании его легко можно изучить и без документации, так что рекомендую :)

Kha (Роберт Конрад)

kha.jpg

    http://kha.tech/ - ультрапортативный медиа-фреймворк, дающий возможность работать с различными уровнями абстракции. Например, для случая графики предоставляются уровни Graphics1, Graphics2, Graphics4 и Graphics5. Graphics1 - самый базовый интерфейс для самых старых устройств, позволяет отрисовывать графику только попиксельно; Graphics2 предоставляет возможности отрисовки 2d изображений (можно назвать аналогом canvas API из html5); Graphics4 - работа с полноценным 3d (OpenGL 2.0, WebGL 1); Graphics5 - более продвинутый API, который позволяет работать с фишками Vulkan API, Metal API, Direct X 12. При этом в случае, если более “высокий” уровень не поддерживается платформой, то осуществляется автоматический “откат” к более “низкому” уровню, например, если вы написали код, используя Graphics5, но он не поддерживается платформой (Android), то он будет работать на Graphics4.

    Одной из новых особенностей Kha в этом году стала возможность создавать кросс-платформенные многопоточные приложения, используя единый API (даже js), в качестве примера был показан тетрис, работающий в двух потоках (второй поток использовался для создания новых фигур).

    Роберт показал также http://kodegarden.org/ - онлайн-песочницу для Kha. Это практически полноценная IDE у вас в браузере, в которой можно создать новый проект, добавить в него файлов с классами, загрузить ассеты и написать свои шейдеры, скомпилировать проект (webgl), скачать его и затем продолжить работу в Kode Studio (форк VSCode, заточенный под Kha, распространяется пакетом со всеми зависимостями https://github.com/Kode/KodeStudio/releases ).

    Пример проекта - http://kodegarden.org/#04bc8ed02ff8a1fb5495a1592535f8e6842105f6

    Исходный код KodeGarden открыт - https://github.com/Kode/KodeGarden и Вы можете сами развернуть свой инстанс (что актуально, так как на этой неделе сайт работал с большими перебоями).

    Доклад Роберта также подействовал вдохновляюще (очень рекомендую посмотреть его, когда записи выложат в сеть) и поздней ночью в пятницу было решено попробовать Kha, а именно портировать небольшой прототип симуляции биома с JS на Haxe + Kha. Так как проект был небольшой (получилось 4 класса) и в нем использовался только Canvas API, то процесс портирования не занял много времени, а для отрисовки мы использовали Graphics2 и GraphicsExtension (класс с дополнительными функциями для отрисовки примитивов).

    Обещаю, что продолжу эксперименты с Kha, и может быть что-нибудь серьезное с ним сделаю ;)

    Чуть не забыл упомянуть, что если Вы уже являетесь сертифицированным разработчиком под консоли и хотите использовать один из этих движков, то можете получить (бесплатный) доступ к  инструментарию, обратившись либо к Николасу (в случае Heaps), либо к Конраду (Kha).

    В качестве примеров проектов, использующих Kha, следует отметить Armory3D и Etherplay (о них были отдельные доклады).

Armory3D

armory.JPG

    http://armory3d.org/

    Редактор на основе Blender и Kha для создания 3D cцен, UI и логики. Родился как инструмент для быстрого прототипирования 3d сцен. Имеется возможность визуального программирования на основе нодов (как в Unreal engine, https://vvvv.org). Выглядит круто (посмотрите сами, чтобы убедиться - http://armory3d.org/news.html )

В данный момент, редактор платный - стоит 50.00€.

Etherplay

Etherplay.jpg

http://etherplay.io/  - платформа небольших веб-игр со ставками в криптовалюте Etherium (поэтому работает только в тех странах, где разрешены азартные онлайн-игры). Представлена двумя типами игр: real-time для одного игрока, и turn-based для двух игроков. Для участия в игре необходимо сделать ставку. В случае однопользовательских игр выигрыш получает игрок, набравший наибольшее число очков, в играх на двух игроков - победитель.

HaxeUI2

HaxeUI.jpg

    HaxeUI2 (http://haxeui.org/v2/) - одна из наиболее продвинутых UI-библиотек для Haxе, которая может работать как с основными игровыми фреймворками (OpenFL, NME, Kha, Flambe), так и с экстернами для библиотек (PixiJS, WxWidgets). В разработке находится поддержка нативного UI для Android. Библиотека расширяема, и есть возможность дописать поддержку для любого другого фреймворка. Есть поддержка “голого” HTML5 DOM (без использования каких-либо сторонних библиотек вообще).

    Разметку интерфейса можно создавать как в коде, так и с помощью XML. Стилизация компонентов осуществляется с помощью CSS (но работает только там, где она поддерживается, например, в нативных компонентах на MacOS в принципе невозможно задать фоновое изображение для кнопки, поэтому там оно и не работает).

    Кстати, Ян Харриган (автор HaxeUI) сейчас работает на редизайном KodeGarden (и параллельно дописывает некоторые нужные компоненты). Предлагаю сравнить внешний вид до

KodeGardenV1.png

И после

KodeGardenV2.jpg

Опыт портирования flash на html5 с использованием OpenFL

    Данная тема раскрыта в докладах двух компаний, которые использовали разные подходы:

FlowPlay.jpg

1) FlowPlay - портировали свою игровую платформу в 2 этапа. На 1-м (подготовительном) этапе, осуществлялся перевод проекта на полностью растровые ассеты (отказ от вектора); на 2-м этапе - портирование AS3 кода в Haxe. Для этого был написан инструмент на основе автоматической замены строк (для наиболее общих простых случаев, которые можно однозначно транслировать AS3->Haxe), после чего программисты вручную перевели оставшуюся часть кода (что позволяет избежать возникновения ошибок типа Null Pointer Exception). В настоящий момент проект все еще работает на Flash, но компилируется из Haxe кода. Ведутся работы по оптимизации вывода в html5, для этого компания наняла Джошуа Граника (основного разработчика OpenFL).

Inno.jpg

    2) InnoGames - портирование city builder’a Forge of Empires. Основным отличием в подходе данной компании к портированию игры на html5 является желание продолжить работу с AS3-кодом (редактируется только AS3 код, Haxe код, который получается в результате автоматической конвертации, не редактируется вообще. Ошибки возникающие в сгенерированном Haxe коде, правятся путем дописывания инструментов для конвертации кода). Для этого за основу работы был взят AS2Haxe - инструмент для автоматической конвертации AS3 в Haxe, который был значительно переработан под нужды проекта. Также был написан инструмент (preprocessor) для предварительной подготовки AS3 кода, обработанный код затем передается в конвертер кода в Haxe и уже Haxe код компилируется в JS.

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

Другие решения для игр

Вне рамок докладов в качестве еще одного инструмента для разработки html5 игр упоминался pixi-haxe - экстерны для популярной js-библиотеки Pixi.js (https://github.com/pixijs/pixi-haxe). Pixi также использует концепцию DisplayList, в нем есть фильтры, системы частиц, tilemaps, поддерживаются анимации Spine и DragonBones, Bitmap fonts, Graphics API (drawLine, circle, rect, etc.). Поддерживается отрисовка как с помощью WebGL, так и Canvas. Также следует заметить, что pixi-haxe официально поддерживается разработчиками pixi.js, то есть можно быть относительно уверенным в будущем экстернов (в том, что они будут поддерживаться в актуальном состоянии).

Haxe Identity

Identity.jpg

Доклад от комьюнити менеджера Haxe Foundation. О том, что пользователи Haxe должны сделать, чтобы привлечь новых пользователей и донести информацию о языке и его возможностях, о проблемах, которые он помогает решить. Выступление оказалось вдохновляющим - один из слушателей решил сделать незапланированный короткий доклад о том, как он использует Haxe в своей работе (для создания приложения для тестирования мед. персонала в больницах, по итогам которого им начисляются баллы необходимые для аттестации).

Saving.jpg

Язык необходимо активнее продвигать в массы, т.к. мало кто о нем знает, сообщество небольшое, однако существует достаточно большое количество проектов, созданных с его помощью (зачастую даже неизвестно, что Haxe как-то был в них задействован).

Using Haxe to build e-learning framework

e-learning.JPG

Лично мне также показался интересным доклад об использовании Haxe для создания электронных обучающих курсов, т.к. данная тема связана с моей учебой в аспирантуре. В выступлении была описана архитектура существующего фреймворка (выделены части обучающих курсов, которые практически никогда не меняются, а также те, которые изменяются от проекта к проекту, выделены основные сущности), первоначально написанного на Flex/PHP, и в итоге полностью переведенного на Haxe (серверная часть компилируется в PHP, а фронт - в html/js). Подобное решение позволило отказаться от услуг внешнего PHP-программиста, который не всегда был доступен (теперь и фронтендеры и бэкендеры “говорят” на одном языке и могут друг другу помогать как знаниями, так и писать код), в качестве еще одного плюса было отмечена типизация языка, которая позволяет избежать многих ошибок, характерных при работе с динамическими языками.

round.JPG

    Вторая половина субботы (последний день конференции) была посвящена круглым столам на различные темы (IDE, спонсирование Haxe, свободная тема). Мне же больше всего понравился круглый стол, посвященный планированию следующего Haxe Summit (возможно он пройдет в Будапеште). Он включал в себя своего рода пост-мортем текущей конференции, например, был отмечен семинар Николаса про Heaps, как очень удачный по формату, а Хью Сандерсон согласился, что его семинар оказался не таким удачным (хотя в нем было много полезной информации).

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

Хочу снова пережить эти мгновения. До следующего года.