Здравствуйте, захотелось как-то мне разработать небольшую онлайн игру для мобилок. По работе в основном пишу драйвера и прошивки для устройств. Но было время – разрабатывал небольшие Flash игры, браузерки, потом игры для соц.сетей, и пару лет работал программистом в крупной игровой компании. Понял, что в качестве профессиональной деятельности за зарплату мне этим заниматься не интересно. Поэтому теперь разрабатываю игры в качестве одного из хобби.
Так вот, хочу сделать небольшой онлайн батлер для мобилок и столкнулся с проблемой выбора движка под это дело
Хотелось сильно не заморачиваться и сразу приступать к разработке. Движков нынче пруд пруди. Чего мне от движка хотелось:
• Более менее знакомый язык программирования;
• Бесплатный и доступный в освоении;
• Поддержка сетевого взаимодействия по UDP, TCP протоколам;
• Поддержка самого движка (ибо SDK платформ и версии OS постоянно обновляются);
• Высокая производительность (большое количество анимаций без тормозов).
Знакомство с движками
Adobe AIR – не игровой движок, но первый кандидат, так как я раньше разрабатывал игры под Flash, и все тут очень знакомо, много полезных наработок. Для небольших приложений очень удобная штука, но даже с использованием Stage3D не очень шустрый. Однако основная причина отказа от Adobe AIR в том, что функционала для мобилок мало, даже вибрацию надо отдельным расширением вставлять, а рекламные сети, in-app и прочие возможности крайне трудно найти, да и те не актуальные из-за непопулярности технологии.
Haxe – тоже не движок, но технология очень интересная. Многие с Flash переходили на OpenFL и прочие производные в свое время, и нахваливали. Решил попробовать на lime и потом на OpenFL по примерам собрать тестовые сборки. На lime все очень быстро, но очень низкоуровнево и много проблем с реализацией дополнительных возможностей Android и IOS, легче на родных средах разработки писать. OpenFL удобен и похож на Flash, но примерно так же медлителен и мало платформозависимого функционала.
Unity – решил посмотреть в сторону одного из самых популярных движков для игр. Для тех, кому Unity – первая среда разработки, наверное, все просто и понятно, но для меня интерфейс – просто ужасен, китайский изучить проще, все кажется абсолютно нелогичным. Прошел туториал по созданию 2D платформера и понял, что уж слишком ко многому надо привыкать, заствака Unity в игре раздражает, плагины и общее взаимодействие со средой раздражает. Решил, что не готов мириться с этим и перешел к другому варианту.
Cocos2d-x – очень косит под стиль Unity, но сильно проще по функционалу. Сделал по урокам игрушку тестовую. Начал проверять на производительность движка, так он и с батчингом еле тянет несколько анимаций. Очень уж тормозной движок.
Разработка новой модели велосипеда
Можно было еще попробовать кучу разных, но даже опыт установки и удаления этих движков и студий неприятный. Вспомнил, что писал как-то давно движок на OpenGL под винду, а потом и на Stage3D. Решил, раз уж все равно для развлечения, то сама задача разработки своего простенького движка достаточно интересна. Пугало только, что для каждой ОС на столько разные среды разработки и предпочтительные языки программирования.
Сначала определим, что мне лично нужно от простейшего 2D движка:
• Отображение статичных/анимированных спрайтов с возможностью изменения: position, rotation, scale, skew, alpha, brightness, colorTransform, visible, управление отдельными анимациями, камера, иерархия объектов;
• Работа со SpriteSheet-ами;
• Обработчики клавиатуры и мыши/тачпада;
• Воспроизведение звуков;
• Файлы сохранений;
• Шрифты и элементы GUI.
Желательно, чтобы движок был и на одном языке программирования, переводить код игры под каждую платформу не очень радует. Мне желательно C/C++. Приступим изучать, что там как.
Android (Android Studio)
Очень много всего удобного для работы с Android, примеры, оформлялки иконок, скриншотов под все версии, удобный дебагер. Минус – практически не предназначен для работы с C/C++, синтаксис едва разбирает, подсказки по коду ждать бесполезно, очень все долго. Сам принцип взаимодействия Java и C/C++ не удобен, но худо бедно работает. Еще кстати размер APK сильно растет, потому что для каждой архитектуры процессора отдельная компиляция.
Расстроило то, что очень много ручного труда с кодом. Даже переименовать проект очень сложно. На некоторых телефонах код на NDK очень долго не стартует, то ли проверки какие-то идут, то ли еще что, просто даже не начинается инициализация. Очень много проблем с обработкой на стороне C/C++ событий паузы, остановки и восстановления приложения. Java рушит все дескрипторы, выданные C/C++ и потоки сишные после OnResume могу стартануть, а могут и помереть. В общем приходиться для надежности заново инициализировать движок и запускать потоки. Запросы из Java в NDK передаются местами в разных потоках, нужно следить за синхронизацией.
Технически использовал OpenGL ES 2.0, со звуками OpenAL, файлы пришлось просить грузить Java, все остальное в принципе, как для Linux, код сразу подошел. По сути переводил свой движок старый, написанный под Windows, писал так, чтобы без изменений компилировалось и под винду (море директив препроцессора). Работает очень быстро, но запускаться приложение может очень долго, притом не начиная никаких инициализаций и загрузок движка.
Вывод: Android не очень жалует C/C++, NDK чисто для вычислений сложных.
IOS (Xcode)
Никогда до этого не работал в Mac OS. Сначала решил ознакомиться с хакинтошами, для ознакомления сойдет, но работать там с Xcode очень неудобно, проблемы с драйверами, в общем не для этого он.
Решил сделать себе подарок на день рождения и приобрести Mac Mini на выигрышные деньги с конкурсов по программированию. С эти уже можно работать. Лицензию разработчика пока так и не взял, проверяю на эмуляторе только, надо бы прикупить б/у смартфон.
Никогда до этого не сталкивался ни с маками, ни с их средой разработки. Думал будет еще хуже, чем с Android. Но оказалось, что среда достаточно дружелюбная, а код на C/C++ встраивается очень удобно и быстро в Objective-C. Неожиданно, но пару дней разбирательств с IOS + Xcode и движок завелся с небольшими изменениями. Половина кода помечена как deprecated, надеюсь еще протянет OpenGL ES на IOS, а то пока сделаю игру, перестанут поддерживать, уж очень хочется каждой корпорации подсаживать на свои технологии разработчиков. Жаль, я не тестировал на реальных устройствах, но займусь как-нибудь.
Для Mac OS и Linux тоже набросал сборки, но подумал, что пока они не очень перспективны для игр. В общем, не так страшен черт, как его малюют. Если тестировать, конечно, еще море исправлений потребуется, да и движок достаточно топорный, но на любительском уровне задача решена.
Сам никому не советую этим заниматься, никогда не окупиться это дело. Готовые движки, конечно, гораздо лучше использовать, куча профессионалов постоянно шлифуют и улучшают, да и готовых крутых решений из коробки очень много. Не теряйте время и силы, разрабатывайте игры.
Сервер
Совсем забыл про сервер для онлайн игр. А я его почти без изменений взял из своих старых проектов: C++, MySQL на Debian Linux. Самый обыкновенный многопоточный сервер с возможностью фоново скидывать данные в базу, логами и прочими мелочами.
Bunny Benchmark
Для тестирования движка и сбора некоторой статистики по устройствам разработал на движке небольшой benchmark, для проверки на сколько ваше устройство пригодно для игр. Бенчмарк грузит в различных режимах работы GPU и CPU, стабилизируя рендер на 30 fps, старым добрым тестом со скачущими кроликами. Также проверяется сетевое взаимодействие (автоматическая регистрация, аутентификация и обмен данными с сервером). Только учтите, у меня сервер – это VPS за 140 рублей в месяц, в описании которого написано: «Для статичных HTML сайтов». А я на нем еще кучу проектов тестирую.
Пока только на Android, если кому интересно, могу выложить для сборку под Windows, но ваши результаты будут игнорироваться в рейтинге, ибо рейтинг для мобилок. Собираю статистику работы движка и возникшие проблемы на различных устройствах. Из того, что уже заметил: при большом разрешении устройства летит верстка спрайтов.
Теперь можно отвлечься на что-нибудь другое, а потом приступать к разработке онлайн игрушки для мобилок.
Удачных выходных.