
Adobe AIR + Nape Physics. Разработка под iOS.
Итак, недавно я купил Mac mini, т.к. давно мечтал заняться портированием одной из своих игрушек под iOS. Вопрос стал в выборе платформы, и я какое-то время склонялся к Adobe Air, пока не копнул глубже…

На днях у нас была локальная «конференция» из пяти человек в одном из питерских баров KillFish. И там мы обсудили мельком и Air, и Unity, и Cocos2d, и прочее… Я голосовал за AIR, т.к. думал, что раз уж «Angry Birds: Star Wars» сделана на Starling + Air, и она летает с приличным количеством физики и эффектов — значит, это мой выбор! Тем более, многие видели демки на Starling, где в iOS мы наблюдаем сотни анимированных объектов со стабильными 60 fps. Но на деле… всё упирается в физику.
З.Ы. ДАННЫЕ В СТАТЬЕ ОБНОВЛЕНЫ!!!

Зерно сомнения в моём мозгу посеял Павел (он же apostol). Придя домой, я скачал с торрентов .apk файл энгри бёрдов, переименовал в .zip, и обнаружил всё то, чего быть в AIR-версии просто не может: уровни в .lua, ассеты в .pvr и .zip, и прочие непотребства. Оказалось, на AIR делали всего лишь версию для Facebook. В довершении я скачал все фреймворки из заголовка, открыл IntelliJ IDEA, подключил сертификаты от Apple, и сделал простую демку для теста производительности физики. Результаты огорчили…
Чтобы получились честные 60 fps:
UPDATE #1
iPhone 4 — тянет всего 40-50 динамических тел.
iPad 1 — 50-60.
iPad mini — до 100.
Многие, конечно, делают и во флешках 24-30 fps. Но это не наш метод. Конечно, если выставить 30 fps, на том же iPhone 4 можно будет использовать до 100 физ.тел.
Что мы получаем в итоге:
1. AIR подходит для игр без физики, GPU вполне тянет большое количество графики.
2. AIR + Nape подходит для игр с физикой, при условии небольшого количества тел (50 тел — 60 фпс).
3. AIR + Nape подходит для нединамичных игр с физикой, при условии занижения фпс (100 тел — 30 фпс).
UPDATE #2
Стоит отметить, что код в Air, всё же, выполняется медленно. Т.к. в тесте особо не было нагрузки по части графики, можно смело предположить, что в реальных условиях мы получим на 20-30% меньше динамических тел на сцене — т.е. минимальный вариант для iPhone4 — 35-40 тел при 60 fps. Не густо, но может хватить для многих физ.пазлов.

Какие выводы можно сделать? Утверждать, что AIR не подходит для iOS игр — нельзя. Можно делать фермы, тауэр дефенсы, матч3 и прочие пазлы, платформеры и ещё кучу всего. Можно делать даже игры с физикой, при условии небольшого количества тел и заниженного фпс. Но вот когда вам нужно сделать динамичную игру на 60 фпс с нормальным количеством физ.объектов — AIR сдаёт позиции.
Посмотрев на свои игры, я понял, что AIR подходит далеко не для всех. Laser Cannon, который я планировал портировать, теперь будет лежать в ящике до выхода Unity 2D (что обещают уже совсем скоро):
Инфа о Unity 2D — http://blogs.unity3d.com/2013/08/28/unity-native-2d-tools/
Видюшка вдохновила. Как и инфа, что Unity для iOS девелоперов теперь абсолютно бесплатная (не Pro версия, само собой). Так что, расстраиваться, в принципе, нечему. C# я люблю не меньше ActionScript 3.0.
Смотрим, читаем, экспериментируем… делаем выводы:)
UPDATE #3
После долгого срача... При помощи черной магии от камрадов TheRabbit и ArtPL мне удалось перекомпилировать приложение с правильным параметром (ipa-app-store), в результате чего производительность возросла в два раза (все цифры в статье я обновил). Выводы можно немного пересмотреть. Ощутимый потолок производительности все же есть, но при хорошей оптимизации игры с физикой на Air делать можно (но не сильно навороченные).
Общими усилиями комьюнити мы добились правильных результатов! Всем спасибо! Ура!

На днях у нас была локальная «конференция» из пяти человек в одном из питерских баров KillFish. И там мы обсудили мельком и Air, и Unity, и Cocos2d, и прочее… Я голосовал за AIR, т.к. думал, что раз уж «Angry Birds: Star Wars» сделана на Starling + Air, и она летает с приличным количеством физики и эффектов — значит, это мой выбор! Тем более, многие видели демки на Starling, где в iOS мы наблюдаем сотни анимированных объектов со стабильными 60 fps. Но на деле… всё упирается в физику.
З.Ы. ДАННЫЕ В СТАТЬЕ ОБНОВЛЕНЫ!!!

Зерно сомнения в моём мозгу посеял Павел (он же apostol). Придя домой, я скачал с торрентов .apk файл энгри бёрдов, переименовал в .zip, и обнаружил всё то, чего быть в AIR-версии просто не может: уровни в .lua, ассеты в .pvr и .zip, и прочие непотребства. Оказалось, на AIR делали всего лишь версию для Facebook. В довершении я скачал все фреймворки из заголовка, открыл IntelliJ IDEA, подключил сертификаты от Apple, и сделал простую демку для теста производительности физики. Результаты огорчили…
Чтобы получились честные 60 fps:
UPDATE #1
iPhone 4 — тянет всего 40-50 динамических тел.
iPad 1 — 50-60.
iPad mini — до 100.
Многие, конечно, делают и во флешках 24-30 fps. Но это не наш метод. Конечно, если выставить 30 fps, на том же iPhone 4 можно будет использовать до 100 физ.тел.
Что мы получаем в итоге:
1. AIR подходит для игр без физики, GPU вполне тянет большое количество графики.
2. AIR + Nape подходит для игр с физикой, при условии небольшого количества тел (50 тел — 60 фпс).
3. AIR + Nape подходит для нединамичных игр с физикой, при условии занижения фпс (100 тел — 30 фпс).
UPDATE #2
Стоит отметить, что код в Air, всё же, выполняется медленно. Т.к. в тесте особо не было нагрузки по части графики, можно смело предположить, что в реальных условиях мы получим на 20-30% меньше динамических тел на сцене — т.е. минимальный вариант для iPhone4 — 35-40 тел при 60 fps. Не густо, но может хватить для многих физ.пазлов.

Какие выводы можно сделать? Утверждать, что AIR не подходит для iOS игр — нельзя. Можно делать фермы, тауэр дефенсы, матч3 и прочие пазлы, платформеры и ещё кучу всего. Можно делать даже игры с физикой, при условии небольшого количества тел и заниженного фпс. Но вот когда вам нужно сделать динамичную игру на 60 фпс с нормальным количеством физ.объектов — AIR сдаёт позиции.
Посмотрев на свои игры, я понял, что AIR подходит далеко не для всех. Laser Cannon, который я планировал портировать, теперь будет лежать в ящике до выхода Unity 2D (что обещают уже совсем скоро):
Инфа о Unity 2D — http://blogs.unity3d.com/2013/08/28/unity-native-2d-tools/
Видюшка вдохновила. Как и инфа, что Unity для iOS девелоперов теперь абсолютно бесплатная (не Pro версия, само собой). Так что, расстраиваться, в принципе, нечему. C# я люблю не меньше ActionScript 3.0.
Смотрим, читаем, экспериментируем… делаем выводы:)
UPDATE #3
Общими усилиями комьюнити мы добились правильных результатов! Всем спасибо! Ура!
- +16
- Crash-512
Комментарии (277)
В общем я не просто так это сказал))
2. Какая верся Air использовалась для тестов?
3. Где гарантии, что ты использовал последний Nape?
я тебе могу unity запороть неумелой работой в нем. потои ругать его, а не свои руки
Мы не знаем как ты обустраивал код, как ты его оптимизировал. По-этому извини, но немного не авторитетно звучит о низкой производительности Air.
Несомненно он не пример большого FPS. Но от рук разработчика зависит примерно 50-70 процентов производительности.
Пришли мне исходники своих тестов и я сделаю технический анализ. Тогда я хоть как-то соглашусь с твоими утверждениями. Ведь я тоже на Unity3d пробовал работать и не нашел там ничего сверхестественного.
Так же ты можешь запилить Nape через нативное расширение и сделаешь прирост производительности.
Я вот не столько unity2d жду, сколько поддержку физики в айр встроенную и мультипоточность
dl.dropboxusercontent.com/u/7202976/NapeTest.zip
Можешь проводить «технический анализ» трёх с половиной классов:)
Starling тут особо не причём, потому что тестировалась физика.
З.Ы. Что-то я не слышал, чтобы Adobe планировали запилить в AIR нативную физику.
Достаточно, чтобы уметь грамотно скомпилить тест.
ps мне в аське неделю назад человек доказывал, что у него последняя айр версии 3.6
Запускай из браузер на девайсе и вываливай отчет. Это может сделать каждый. Пока я не услышу результаты — ничего не буду рассказывать.
бла-бла-бла, так как OS X не узнает адреса, начинающиеся с «itms-services:»
Что сделать-то надо?
скачай файл по прямой ссылке colorsite.ru/iOSNape/nape.ipa и заинсталь себе как тебе удобнее
Но да, я ошибся, с такими костылями AIR может больше, чем я написал.
Производительностью в больше части зависит не только от медленного AS3, о чем я не спорю. Но еще и от не правильных подходов к сборке.
1) Твоя сборка ipa по дефолту стоит как device testing. Быстрая компиляция, но низкая производительностью. Deployement type надо ставить Market/AppStore Market. Ты все показатели получает от 1.5 до 2х лучше
2) Зачем для старлинг запрашивать antialiasing? Это не 3Д графика. Достаточно юзать небольшой хак. Отступаешь по 1 пикселю с каждой стороны грифики. Предварительно делаешь её smooth в том же фотошопе. И у тебя уже нет надобности рассчитывать сглаживание, которое для 2Д нафиг не надо. Но я могу и ошибаться «надо или нет». Дело вкуса
3) Ты когда заливаешь текстуры для 2Д — тебе нафиг не нужны mipmaps, которые кушют лишнюю память. Отключай их.
4) Самый важный параметр, который я не знаю зачем для mobile — enableErrorChecking. Ставь его false и ты поднимаешь у старлинг малость fps. Не помню где там был еще запрет на отлов потери контекста. Он нафиг не нужен. Его раньше false ставил.
Несомненно, Air пока «не тянет» так, как мы все бы того хотели. Но и проводить ошибочные бенчмарки не совсем правильно. Люди могут быть гениальными программистами. Но у них могут быть небольшие пробелы в деликатных вопросах по сборкам :)
Всем мир!
Всё-таки вот ты мог бы тоже по человечески. Я провёл кое-какую работу, и выложил результаты. Если бы ты не хамил, а просто помог советом, разобрали бы всё это, и выложили исправленные результаты.
Рад, что на твоей кухне стало меньше говна:)
Там вот так этот вопрос решается.
Как конкретно решить в IntelliJ IDEA я не знаю. Я могу помочь найти ошибку, но не всегда знаю как её устранить в ПО, которого у меня даже нет :)
Во Flash IDE меня не заставить кодить и под дулом пистолета:)
Твоя задача пропихнуть как-то -target ipa-app-store :)
Относительно недавно человек жаловался вообще на 15 fps в приложении. Когда он поставил ipa-app-store — он просто был в шоке, какая разница может быть. Не, ну ясно не +100500 процентов. Но все же прилично выше.
Уже не впервый раз я вижу, что сборки в IntelliJ IDEA приводят к фатальным ошибкам в сборках без ведома людей. Господа жалуются на низкий FPS. Я люблю Flash Pro IDE за то, что там настройка самой сборки осуществляется элементарно через Drop Down и никогд не глючит :) Не ставит что-то «от себя», когд ты другое что-то ставишь.
Я вот хотел найти Nape исходники — что-то не вижу их нигде. Хотел оценить сколько часов надо для переноса н Native Extensions. Правда не знаю в надобности. Ведь Билл Ховард обещал Air со встроенной физикой на основе Nape.
А если бы пилить nape на нативном расширении — фактический прирост будет конечно, но не 500%. Скажем с 40 боксов получим 90 стабильно думаю. Хотя для большинства игр и 30 уже достаточно будет.
IntelliJ IDEA лучшая IDE для разработки ;)
И не найдешь. Никто ж не говорил что он Open Source
Из последних данных — что-то обещали на октябрь. Что именно — точно не ясно.
Есть буллет физикс на алхимии первой. У приятеля машин в 3д на нем ездит.
Если бы Adobe не грозились Air и физику — кто знает, может быть уже запилил бы кто
Учитывая что C# тож самое что AS3, выглядит очень соблазнительно :)
Please be patient!
Инфа отсюда
Мое дело предложить, не знал что реакция будет такая бурная.
Отличия между as3 и haxe минимальные, поправить 3 класса и проверить недолго, намного быстрее чем ждать выхода Юнити2Д.
У меня нет девайса, так бы проверил.
+ FlashDevelop хорошо поддерживает haxe, вот инструкции если интересно:
haxe3.blogspot.com/2013/07/getting-started-with-haxe-3-and.html
haxe3.blogspot.com/2013/07/setting-up-flashdevelop-for-haxe-3-and.html
github.com/openfl/openfl/wiki/Get-Started
github.com/matthewswallace/openfl-tilelayer
Но они и правда уже забили на флеш.
Статика и Кинематика в Нейпе очень быстрая. Динамики даже в не оптимизированном платформере не больше 20-50 объектов. И то из них не спит 5-10 всего. Это даже на 3gs будет летать.
Я недавно портировал наш Georganism на Старлинг+Нейп для мобилок. Уровни совершенно не оптимизировал, каждый блок — это отдельное тело. На 3гс наблюдаются лёгкие тормоза, но играть можно. На девайсах мощнее проблем нету совсем.
Или, к примеру, здесь на вид тел 100-150:
http://www.physicsgames.net/game/Jelly_Cannon.html
И я не спорю, что в принципе можно нагрузить физику. При желании можно и графику нагрузить. Очевидно надо делать скидку на мобильность платформы.
В том плане, что на юнити можно так же легко сделать игру, которая даст 2 фпс на ипад4.
Так-то, если в AIR действительно впилят нативную физику, будет почти совсем хорошо:)
play.google.com/store/apps/details?id=zjgame.laser.cannon.funnygame
Разница ощутимая, всё-таки…
Работает!:) PNG с обводкой из почти прозрачных пикселов хорошо заменяет anti-aliasing, практически неотличимо.
Интересно часто ли в комментариях игроки указывают недостаток в 30 фпс и влияет ли он на продажу.
Дело в том, что прием, когда игра показывает сколько хочешь фпс, а логика/физика вообще 10фпс не фокус.
30 фпс физика должно быть достаточно, если туннельные эффекты избегать.
выше ответил подробнее
Зачем пример делать, народ, это старо как мир. Вы думаете если в стратегиях реального времени фпс 100 то и логика с пасфайндингом и пастрекингом путей каждого юнита, АИ итд все это 100 раз в секунду считается? И еще если кадры в секунду пляшут в завиcимости от железа, то и логика плавает?
10 раз в секунду логика. А графика — сколько потянет железо.
Можно почитать, плясать отсюда:
www.gamedev.ru/code/forum/?id=156562
gafferongames.com/game-physics/fix-your-timestep/
www.koonsolo.com/news/dewitters-gameloop/
Или будет запаздывание на два кадра?
Если у тебя плавает граф. фпс — то положение тела интерполируешь пропорционально прошедшему времени. Во флешке можно проще: если установил фпс 60 а физика 30, то ты точно знаешь что в промежуточном кадре надо положение вполовину брать.
gamedevblogs.ru/blog/iphone/1312.html#comment36886
В общем пока делаю основную работу и жду ответа Луки. У меня руки чешутся хотя бы 10 строк закинуть в native extensions :) Он же тогд порвет все ожидания и еще больше обрадует
И перевод из Хэкса на АС3 невозможен по этой-же причине.
А взяли их из анализа Алхимии, в блоге Николаса (который Хэкс изначально разработал) все есть.
ВластиAdobe скрывают!А вот если хочется раза в два под предел физику нагрузить — тогда надо просить нейпу вместо одного метода step иметь методы startUpdate(deltatime), resolveCollisions(), iterateVelocityResolving() iterateVelocityResolving() — последние два можно дергать в цикле сколько надо раз. Можно еще попросить коллижн детекшн побить на фазы.
То-есть флеш просто так не простаивает, он пытается нагнать 60фпс. Да неравномерность будет, вместо 16,16,16,16,16,16 будет 12,20,12,20. Но это все равно сильно лучше тормозящго 60фпс при полной физике, и плюс никогда не бывает 16 16 16 16 — оно все равно плавает.
З.Ы. Ну, или отдельным потоком физику пускать или архитектурно шаг на две итерации делить.
Интересная фишка.
Тоже самое с полётом снаряда.
таким обрзом у тебя будет пиксельня привязка и ничего не будет стоять на двух пикселях
Конечно, чем выше FPS — тем выше плавность движения. Тут даже спорить смысла нет. Но бывают такие ситуации, когда важнее получить четкое движение (пиксельное). И оно важнее, чем просто быстрое :)
Для Stage3D неактуально.
А тут Луку спрашивали по планам развития нейпа
Каждый кадр step(1/60, 3, 3);
Через кадр step(1/30, 6, 6) + интерполяция.
При наличии большого количества тел, когда «каждый кадр» начинает тормозить, интерполяция может дать прирост 20-30% производительности (пример, было 20 фпс, стало 30). Но при этом картинка становится очень дёрганной, ибо реально каждый второй кадр в два раза тяжелее. Получается, что смысла так поступать нет. Единственный метод — разбить расчёт физики на 2 кадра, но без исходников такого не замутить.
dl.dropboxusercontent.com/u/7202976/NapeTest.zip
При 100 объектах он жрет тупо 10-11мс + раз в Х секунд по непонятным причинам от 50 до 100мс как щелчок и снова оке… 10-11мс. Иду в эту функию и офигеваю. Она пустая! Стоп, думаю. Может дизассемблер опкод не знает. Лезу в хакс исходники и вижу реально — она пустая! В релизе лежит пустая функция, которая при 100 боксах отъедает 10-11мс! Epic fail!
утром попытаюсь понять нафига она там
(в коде с префиксом ZPP_)
github.com/deltaluca/nape/tree/master/cx-src/zpp_nape/space
bphase.broadphase(this, true); действительно пустой. Но вызывется не тот класс — там стоит переназначение.
Я в сорцах увидел это и подумал это косяк. Оказалось нет. Засунул сюда флаг — мы сюда не заходим
public function broadphase(space:PR(Space), discrete:Bool) { assert(false,«not implemented»); }
Haxe добавляет глупые инструкции в код.
К примеру:
if ( something ){
return null;
}
haxe пишет в abc файлы
if (something ){
false;
}
if ( false ) {
return null;
}
и такого очень много! Представьте, что если этот весь мусор был бы убран — движок и без всяких Native Extensions был бы поживее.
Хоть haxe и ацтой, но не до такой степени.
Опять на кухне проблемы начались что ли? :D
Скриншот иллюстрирует лишь пример процесса этой работы. Так вот — вроде и версия ABC подходящая. И опкоды по hex совпадают с теми, что существуют. Но какая-то муть выходит.
На это потребуется куда больше времени, чем я думал. Походу проще дождаться ответа Луки, как он делает сборки и в них проводить уже изменения.
2 Профит!
И видео Bullet ANE vs AwayPhysics: www.youtube.com/watch?v=IH4mrUagA74
Сам не смотрел, не знаю что там
Так что это точно не релизная сборка :) А разница между ними огромна.
Но суть та же, что и я хочу. Некоторые методы выведены в Native