Jak začít. Pokud se zabýváte vývojem aplikací a her ve Flashi, určitě vám neušlo vydání nové verze Adobe Air 2.7. Starší verze 2.6 je již nějaký ten pátek mezi námi. Pokusím se celou věc napsat co možná nejobjektivněji, ale pravděpodobně se neudržím, jelikož jsem objevil jiné technlogie, které vývoj mobilních aplikací usnadňují, urychlují a především opravdu umožňují.
Pokud jste si hráli s Adobe Air 2.6 víte, že oprášilo publikování z "Flashe" na iOs zařízení. Poněkud hůře to dopadlo s výkonem. A také celkové workflow, což je jedna z věcí, kterou se Adobe stále chlubí, utrpělo značnou újmu.
Ve chvíli kdy 2.6 vyšla, jsem povyskočil ze židle a jal se vyvíjet a testovat. Jako majitel iPhonu, iPadu a dalších zařízení od Apple, byla snaha dát Airu šanci.
V textu se budu vyjadřovat pouze k mobilnímu Airu. Flash na desktopy, Flex a jiné věcičky mi naopak přijdou velice dobře použitelné.
Vytvořím první projekt. Všude píšou, že AIR výkonem neoplývá, optimalizace je základem a seznamy toho co Air na mobilu nesmí používat se pomalu, ale jistě prodlužují.
Úvaha. Začnu s třiceti kruhy na obrazovce, vytvořím ve smyčce sprity. Budu procházet jednotlivé objekty na Stage a každý frame měnit náhodně pozici. Napsal jsem to asi za 5 minut. Následuje publikování na zařízení (po nemalém pátrání na webu). Build je hotový, přes iTunes ho nahrávám do zařízení. Jak by řekl Steve Jobs: "Boooom".
Bohužel. Ono pověstné "Boooom" se nekonalo. iPad sebou málem trhnul a na displeji mi ukazoval čtyři snímky za vteřinu. To jsem opravdu nečekal. Rozladilo mě to, ale říkám si: "Nic, pro mobily to neznáš,koukni po webu, jak to dělat a optimalizovat."
Jal jsem se vrhnout do víru optimalizací. Vše co se dalo jsem zakešoval. Vyhodil jsem procházení stage a nahradil ho polem objetků. Vyhodil jsem kruhům jejich enterFrame a udělal jeden globální. Další build. V pořadí druhý. Jak myslíte, že vypadal frame rate. Booom. 3-4 FPS (iPad). Co dělám blbě? Začínám být značně nervózní.
Další optimalizace, kontrola XML descriptoru, přepnutí do GPU modu. Celkem 6 buildů a stále žádné booom. Aplikace se stále táhne jak smrad. Nedokázal jsem zjistit příčinu. Pochybuji, že dělám něco natolik blbě. U tak jednoduchého projetku s třiceti kruhy, snad nejde ani nic zkazit.
Mimochodem build na iOS, tedy samostatný proces od kompilace až po deploy na zařízení trvá v případě AIRu 2.6 cca 5-6 minut. Celková ztráta času tedy něco přes jednu hodinu na buildech. Debug neexistuje. Celkem asi tři hodiny na neustálé přepisování a zjišťování. Výsledek nula. Jsem neskutečně vytočený a nadávám na flash jak to jde.
Jelikož se zabývám vývojem mobilních her na platformě Unity3D, pokusil jsem se udělat podobnou scénu i v tomto prostředí. Prostě jen proto, abych si je mohl výkonově porovnat. V unity pracujete vždy ve 3D, takže místo třiceti kruhů zde bylo použito třicet koulí nasvícených jedním světlem. Opět dle stejného zadání, měnily náhodně svoji pozici každý frame.
Build. Trvá do 1 minuty, včetně umístění aplikace do zařízení a spuštění aplikace. Booom. 30 FPS. Hurá, vůbec to nebolelo. Celkový čas do funkční aplikace v mobilu cca 15 minut.
Unity produkuje nativní Objective-C kód, který se následně kompiluje v XCode. Otevírám hlavní konfiguraci v XCode a nastavuji 60FPS jako maximální hodnotu. 30 FPS je default a víc než 60FPS Unity na mobilu neakceptuje. Build.
Aktualizace a další build již bez zásahu v Unity, pouze přepsání jedné řádky v Obj-C souboru a build přes Xcode. Booom. Booom. Boooom. Koule skáčou vesele a FPS je stabilně na 60fps. Skvělé. Celkový čas na další test. Necelá minuta.
Zjištění: Chyba nebude ve mě, ale kdesi v AIRu. Jsem klidnější.
Jelikož jsem s flashem zápolil od nějaké verze 4 a prošel si všechno včetně vychytaných tellTargetů, problémů s UTF8 v raných verzích flase. Mám to takříkajíc v krvi a pokud najdu způsob jak v Mobilním AIR dělat rozumné věci, budu je v něm dělat. Actionscript mi vyhovuje, mám na něj super vývojové prostředí, po webu milióny návodů, hotových řešení a support od komunity.
Ale zatím mi to nějak nejde. Stále se potýkám s mizerným výkonem.
V officu jsme udělali deal s Adobe, podepsali NDA a máme k dispozici novější verzi Adobe Air 2.7 v nějaké prerelease verzi. Je to nádhera. Všichni se potí u 2.6 a my máme super rychlý (prý 4x) AIR 2.7. Je opravdu o dost rychlejší. Zkoušíme vše možné a děláme hru ve Flixelu. Jde to. Není to žádná paráda, ale běží to na přijatelných 20 FPS. Nejkritičtější je samozřejmě iPad se starým grafickým čipem a největší obrazovkou.
Dře to, ale jde to.
Ale co se nestane. Udělali jsme nějaké změny v kódu a přidali jednu herní obrazovku. Booom a nic se nekoná. Prostě to přestalo fungovat. Aplikace se zkompiluje bez chyb. Swf je v pořádku a v prohlížeči nebo v externím Flash playeru jede. Pouze na zařízení nefunguje a končí to vždy celobarevnou zaseklou obrazovkou. Vtipné. Řešíme to zhruba 4 dny a aplikace se testuje pouze na Androidu, kde to funguje.
Mezitím začínám svůj malý domácí projekt, předělávku hry ze stařičkého Atari. Chvástám se před kolegou, jak to dělá blbě, že moje hra na iOSu krásně jede. Boooom. Pár změn a jeden build a jsem tam kde on. Zaseklá obrazovka. Parádá. Vůbec netuším co jsem udělal blbě. Řeším to asi 4 večery po práci a celý víkend.
Stálo mě to 61 buildů a několik branchí v gitu. Build ve 2.7 je rychlejší. Zhruba do 4 minut je apka v zařízení. Tak si to spočítejte. Neskutečná ztráta času. Nakonec jsem zjistil, že je průser v pre verzi Airu, když jsem náhodou přepnul buildování z ipa-test-nodebug na ipa-adhoc. Hurá, zase to jede. Ve chvíli kdy jsem to zjistil, bych zabil kohokoliv z Adobe.
V Adobe mezitím vymysleli spoustu teorií co je příčinou. Bohužel ani jedna příčina nebyla ta moje. Následující den s pompou sděluji kolegovi v práci jak elegantně jsem problém vyřešil. Nastavil si build na adhoc. Booom. A nic. Zaseklá obrazovka. Takže, kde udělali soudruzi v Adobe chybu? Nikdo netuší. Možná je tohle trošku podpásovka pro Adobe a jeho Air, jelikož jsme neměli ostrou verzi, ale krásně to dokresluje práci a celé workflow s Airem.
Zjištění: Nevím co kdy přijde, kdy jaká změna způsobí nefunkčnost aplikace. Dělat evangelistu v adobe musí být za trest.
Firemní hra nějak funguje. Ne ideálně, ale hrát se dá. Můj domácí projekt se po večerech rozvíjí. A řešíme co dál. Chceme udělat nějakou rich aplikaci. Nějakou mini rss čtečku. To nebude těžké. Jde se na to. Hledáme cestu. Flex a jeho komponenty na mobil použít nejdou. Píšeme vlastní, pure AS3. Kolega dopsal základní skrolovací table view, tak jak ho znáte z iPhonu. Docela se to roluje a odezva není špatná.
Cvičně tam dáváme nějaký text, který tam ve výsledku bude. Do každé buňky 3-4 řádky. Booom. A jsme zase v háji. Cuká se to. Mnoho manažerů by to asi vzalo, ale vezme to i schvalovací proces u Apple?. Jedna z věcí na kterou Apple dbá, je odezva a rychlost aplikace. Zvlášť když se jedná o tak jednoduchou aplikaci.
Jak to vyřešit. Texty bude chroupat server, bude parsovat a dělit do bloků. Každý blok bude mít vlastní textfield. Uděláme object pool. Snad to bude fungovat. Ha. V Airu je nějaký nový textový engine. Zkusíme ho.
Build. Boooom. Oproti předešlé verzi (2 dny zpátky) to jede v pohodě. Bohužel nový textový engine neumí html odkazy. Znova na nic. Kolega už se stává expertem. Už začíná tušit, že to nebude tak jednoduché.
Zjištění: Nejde to, text aplikaci spolehlivě zastaví. Optimalizace je bolestivá a náročná. Výsledek není adekvátní vynaloženému úsilí.
Moje trpělivost je ta tam. Začínám hledat alternativu na aplikace (ne na hry) pro iOS a Android.
Nacházím několik nástrojů. Nejslibněji vypadá Xamarin, bohužel ještě není oficiálně vydaný. Další adept je Appcelerator.Je to Javascript. Stahuji vývojové prostředí postavené na Eclipsu (Titanium Studio). Během pracovního dne, v pauzách kdy přecházím z projektu na projekt píšu aplikaci. Večer prezentuji funkční RSS kolegovi, co už si z Airu vyrval skoro všechny vlasy. Teď si dotrhá ten zbytek. Celkový čas na vývoj? Necelá hodina.
Asi jsem našel vítěze na rich aplikace.
Přicházím domů. Uvažuji o tom, že si zkusím aplikace napsat i v Objective-C. Ať mám výkonové srovnání a přehled o tom, kolik času a úsilí stojí udělat applikaci v nativním prostředí. Jsem jazyky C/C++ absolutně nepolíben.Tuším základy, ale jak používat pointery po mě nechtějte.
K mému překvapení, se mi RSS čtečku v Obj-C podařilo vyrobit. Dalo to více přemýšlení, více psaní. Na druhou stranu GUI jsem si naklikal v editoru. A první hodinu po půlnoci jsem měl aplikaci hotovou. Ráno prezentace šéfovi vývoje. Rozhodnutí padlo. AIR ne!
Závěr
Adobe Air bude jednou výborný, funkční a dobrý produkt. Kdy to bude, vám ale nikdo neřekne. Stále se přidávají nové a nové věci, ale výkon na dnešních zařízeních je tristní. Pokud hodláte zařadit mobilní Air do produkčního řetězce, udělejte si mnoho testů. Za mě nemohu dát doporučení.
V budoucnu to jistě bude cesta jak udržet jednotné workflow. Nebudete muset mít nový tým na mobilní platformy. Ale v tuhle chvíli to prostě nefunguje jak produkce vyžaduje. Neustálé záseky a řešení zbytečností. Ve většině případů musíte vaše hotová řešení přepsat, komponenty zoptimalizovat a neustále hledat cestu, jak se udržet na rozumné hranici frame rate. To vše může na dostatečnou dobu rozbít vaše pracně budované workflow. Upozorňuji, že Air vám nedává žádný výkonový polštář do začátku. Optimalizovat musíte tvrdě již od první řádky kódu. Jinak budete plakat.
Pokud nemáte zkušenosti s jiným prostředím pro mobilní vývoj, asi dáte Airu více šancí. Kdo má zkušenost například s Unity na hry, Appceleratorem na aplikace nebo i samotným Xcodem nebo Javou. Nabyde hodně rychle dojmu, že je technologie naprosto nepoužitelná, nebo že si z něj Adobe dělá srandu.
Závěr je za mě prozatím dost negativní. Možná příště. Až budou mít všechny mobilní zařízení dvě jádra tak jako nový iPad 2.
Přeji hodně zdaru a pevné nervy.
Telefoní číslo do Bohnic (pro mimopražské Bohnice jsou blázinec) je zde: 284 016 666