Начало долгого пути.
Итак, наш главный герой пришел в себя на пороге тусклой комнаты, созерцая в оконце стремительно проваливающееся за горизонт солнце. Обреченно произнеся - "Пора..", он развернулся и, спустившись по жалобно скрипящим ступенькам, уныло побрел к темным зарослям и болотам, именуемой "долиной Гугль".
Вообще странно, что эти чащобы назвали "долиной", в простонародье они снискали славу гиблых и дремучих.
Нет заблудиться там сложно, однако, если Вы захотите собрать грибы то вернетесь с арбузом, а если отправитесь туда по ягоды, то вернетесь скорее всего с козой. Лишь абсолютной ночью, когда вы перестаете полагаться на собственное зрение, есть шанс вернуться с тем, за чем вы туда отправлялись. |
А наш главный герой побрел туда в поисках движка, видите ли, изобретать велосипед ему было лень. Долго ли, коротко ли, но одним прекрасным полднем он вернулся в свое село с целой арбой движков. Они были самых чудных форм и цветов и ему предстояло выбрать среди них лишь один единственный и неповторимый, запах которого не вызывал бы у него отвращения.
Первый взгляд на Cocos2d-x.
Выбор пал на кокс (по научному на латыни именуемый алхимиками "Cocos2d-x"), это своего рода переделка популярного под огрызки кокса (те же пресловутые умники окрестили его "Cocos2d"). При первом взгляде аж дыхание перехватывает - поддержка всех возможных платформ вплоть до экзотики в стиле ежевики (на латыни "Blackberry") и бада-бума (на латыни "Bada").
Сам движок представляет из себя что-то в стиле "framework", написанный на C++ и предоставляющий пользователю выбор языка между С\С++, Java и HTML5. Есть и поддержка Lua скриптов.
Движок бесплатен, причем список возможностей не уступает многим коммерческим и при всем этом активно развивается. Коммьюнити обширно и достаточно активно, а самим движком не брезгают и некоторые "профессиональные" разработчики.
В общем тут бы поставить точку и как Вы могли бы себе представить вышел бы такой идеал... Но стоит снять розовые очёчки, и Вам перестанет все казаться радужно серо-бурмалиновым цветом, но обо всем по порядку. |
Каков на вкус Cocos2d-x.
Итак, чем же польстился наш главный герой? цветом? вкусом? запахом? возможностями? нет, нет и еще раз нет. Польстился он как ни странно на возможность разработки на С++.
Нет, наш герой вовсе не страдает садомазахизмом, он просто не знает эльфийского языка Java и тем более гномского HTML5, бесплатных движков под Android на могучем русском C# попросту не существует, а выбор движков на C\C++ крайне скудный.
Как выяснилось разработчики и пользователи пристрастившиеся к коксу преимущественно эльфы и гномы (кстати большая часть этих славных эльфов и отважных гномов из поднебесной). О чем наглядно говорит релиз среды разработки кокса под Lua и Java скрипт. |
А вот насчет удобства работы на С++ никто особо и не думает. Под каждую платформу надо компилировать разными компиляторами (а под огрызки так вообще лишь из под мака), а ведь у каждого компилятора и среды свои собственные заморочки, дефы и проблемы. Но ладно фиг с ним - надо так надо, но скакать с одной IDE на другой это уж откровенное издевательство, не говоря уже о том чтобы собирать это все через командную строку.
Vs-android в помощь.
Терпеть такие лишения наш доблестный герой не был готов и после очередного марафонского полуночного забега в долину "Гугль" вернулся с ответом на вопрос, коим стал "vs-android". Это чудо-проект добавляет в MVS профиль для сборки проектов под Android путем их компиляции при помощи GCC.
Установка для новичка не такое уж и простое дело, но после танцев с бубнем мы получаем возможность писать в любимой среде, забыв про возню с Android NDK, SDK и ANT. Теперь при нажатии на заветную F5, мы на выходе получаем заветный *.apk, готовый к работе на вашем или не очень вашем телефоне. |
Ну, скажи: «Привет, мир!»
Все это замечательно, но дальше поджидают множество проблем со сборкой проекта в студии под кокс. То есть нужно перенастроить его под статичную линковку в наш собственный проект. Очередной забег в "Гугль" не принес никаких результатов, местная фауна и население выпучивало глаза от подобных вопросов. Так что в поисках решения пришлось залезть в самые дебри сборки под Linux и опций компилятора GCC, тем не менее, проблему удалось решить. И вот на экране телефона замаячил HellowWord на коксе.
Прелести и кошмары отладки.
Честно говоря, герой у нас редкостно ленивая скотина, и каждый раз вручную копировать и ставить приложение на телефон ему лень Но тут на помощь пришла утилита adb из SDK Android'а, что позволяет управлять телефоном подключенным в режиме отладки. Результатом стал батник, что завершает запущенное приложение, удаляет его, копирует новую версию с компа и устанавливает, после чего запускает ее.
Естественно для полного счастья необходимы томаты (в смысле "Visual Assist" если кто не понял) и "Visual SVN", но у доблестного автора это дело давно уже ассоциируется с MVS, по этой причине и не будем на этом заострять внимание. Теперь все было готово к работе, по крайней мере на Android и Windows, а руки уже чесались и рвались в бой, успевши изрядно намаяться со всей от этой возней.
Несмотря на все удобства, сборка под Android - дело хлопотное, а отладка так вообще кошмар на улице Грызов. Дело в том, что никакого отладчика для Android не существует в принципе, нет конечно есть парочка но все они являются платными костылями, использование которых в подобном бесплатном проекте как-то не уместно. Так что вместо брекпоинтов пришлось довольствоваться выводом сообщений в лог, благо хоть его с горем пополам можно было получать через упомянутый выше интерфейс adb прямиком на компьютере.
Вообще написание неуправляемого кода без багов - дело невозможное: утечки памяти и обращение к неиспользуемым адресам в памяти и многие другие пакости происходят сплошь и рядом, как по невнимательности, так и вследствие плохого знания или неверной трактовки используемого стороннего кода. В некоторых местах вообще затруднительно предсказать поведение программы. |
Так что, несмотря на все наши труды, работать в основном придется под Окнами (ака "Windows" на латыни), лишь после чего заниматься переносом относительно стабильного и отлаженного под окнами приложения. Забегая вперед признаюсь - автору удалось получить целый пучок багов, проявившихся только под Android. Впрочем, сборка под другим компилятором дело тоже не на 5 копеек и требует приведения синтаксиса к общему знаменателю. Но пока, конечно наш герой всего этого не знал и, пожав плечами, он принялся за Оконную версию.
Взгляд из под Windows.
И вскоре глаза потихоньку начали лезть на подбородок... Нет мы конечно понимаем движок позиционируется как мобильный, но тем не менее такое пренебрежительного отношение к окнам поражает (ситуация с маками и пингвинами не лучше). |
В нем не оказалось абсолютно никаких средств работы с такими обыденными вещами как клавиатура или вывода собственного лога кокса. Да чего там даже возможность перехода в полноэкранный режим попросту отсутствует. А звуковой движок это вообще настоящий анекдот, если в двух словах, то кокс скрытно запускает стандартный медиа проигрыватель и при воспроизведении звуков \ музыки пихает их этому проигрывателю. Ко всему прочему никаких излишеств, нет даже возможности управления громкостью.
Благо что наш герой чувствует себя как рыба в воде под окнами и переделка и реализация всего это не вызвала никаких проблем, в том числе и звуковой движок поменялся на OpenAl. Впрочем, это далеко не полный список что пришлось привинчивать - в коксе не оказалось никакого профайлера быстродействия, и пришлось писать счетчики используемой памяти и загрузки CPU.
Нашлось место и проблемам совместимости - для работы рендера: требуется поддержка OpenGL 1.5, но некоторые современные дискретные видео карты (например Intel HD Graphics 3000) не поддерживают сей анахронизм, несмотря на поддержку 3 и 4 версии.
Таким образом, проекты на коксе имеют экзистенциальные проблемы с запуском на многих ноутбуках. Самого автора ждал данный сюрприз, когда он хотел взять с собой код в дорожку на ноутбуке... Так что сей чудо-галлюциноген ни в коем случае не подходит для серьезной разработки под настольные системы, их поддержка чистой воды профанация. |
Но, тем не менее, кокс выбирают для разработки под мобильные устройства, в данном случае под Android и настольная версия была вторична, да и особо от нее ничего не требовалось так что жить можно было....
Cocos2d-x - новые трудности
Несмотря на активное развитие коксу, как и любому галлюциногену, свойственны глюки, особенно это касается взаимодействия диспетчеров и менеджера сцен, а вернее их переключения. Конечно, баги есть у всех, но отсутствие проверок внутренней логики собственного API в проекте такого уровня немного поражает. |
При разработке движка я опять удивился логике авторов - некоторые тривиальные вещи напрочь отсутствуют в API, типа запись файлов. Наверное в поднебесной не знают про кэш и делают игры без сейвов.
Еще небольшой пинок в сторону кокса - необходимость Яво врапера под Android, хотя ни для кого не секрет, что Гугль еще в Android 2.3 (API Level 9) реализовал полноценную поддержку нативного кода, но видать эльфы не позволяют целиком отказаться от Яво костылей. |
Но главный косяк кокса - это отсутствие простых средств буферизации и рендинга в текстуру, что без костылей делает его затруднительным для использования в перегруженных графикой проектах. Вообще кокс как и большинство движков общего назначения хорошо справляются лишь с достаточно простой графикой, т.е. сделать какую-то красивую аркадку раз плюнуть, а вот огромную многоуровневую карту для какой-то полноценной рпг или стратегии может уже стать проблемой. Хотя с другой стороны исходники имеются и можно воротить в них что душа пожелает.
Оптимизация под Андроид.
Другой интересный аспект - это оптимизация приложений. Глядя на гигагерцы и графические ускорители на мобильных телефонах, может сложиться впечатление, что смартфон ненамного уступает десктопам.
Как бы не так, взять к примеру видеопроцессор Qualcomm Adreno 220 (скажем, достаточно хороший вариант для устройств выпущенных в районе 2011 года). Его производительность составляет 2,4 миллиарда пикселей в секунду. Много? Отнюдь, ведь игра должна выдавать 60 FPS, а это значит что на экране 1280х720 за секунду нужно отрисовывать более 55 миллионов пикселей в секунду, лишь для того чтобы вывести одну картину. А ведь поверх нужно рисовать спрайты, интерфейс, текст, иконки и прочую лабуду.
Но это еще хороший вариант, но в эпоху второго андройда в бюджетных устройствах обычно применялось что-то вроде Adreno 203 с производительность 0,133 миллиарда пикселей. Конечно, там и разрешение было меньше, но тем не менее, скажем, если в первом случае быстродействия хватит для наложения 44 полноразмерных изображений, то тут лишь на 5 при разрешении 840х480.
К тому же у мобильных видеопроцессоров нет собственной памяти, вместо оной они используют часть системной, которой тоже достаточно мало на старых и слабых устройствах...
Так что если Вы желаете добиться поддержки устройств под управлением Android 2.х, придется напрячься с оптимизацией, рисуя полигоны батчами, а спрайты объединяя в атласы.
Самое печальное во всем этом то, что на подобных видеопроцессорах напрочь отсутствуют шейдерные конвееры, и использование самых примитивных шейдеров приводит к падению производительности в разы. А ведь шейдеры хороши не только для спецэффектов но и для экономии ресурсов...
Финальная битва.
Скоро сказка сказывается, да не скоро дело делается. Но рано или поздно дело все же делается, и вот перед нами готовая игра.
Все бонусные очки от полученных LEVEL UP'ов герой советует вложить в удачу, она потребуется для финальной битвы с боссом, в роли которого выступает "Google Play". Но одолеть его можно лишь с релизной сборкой, а для того, чтобы ее получить потребуется подписать ее сгенерированным сертификатом, выровнять данные. |
Звучит намного проще и понятнее, чем на самом деле, но, даже сделав все правильно, есть шанс обнаружить, что у босса иммунитет по непонятной причине к данной сборке, и одни лишь темные магистры знают почему. Вот тут и потребуется удача...