Programování výkonných her pro Windows Phone 7

Windows Phone 7 je nová mobilní platforma Microsoftu. Jak můžeme pro tato zařízení programovat výkonné hry, jaké zde máme možnosti a na co bychom si měli dát pozor?

První telefony se systémem Windows Phone 7 byly uvedeny na podzim roku 2010. Tento operační systém vznikl jako nástupce úspěšných Windows Mobile. Přinesl nové uživatelské rozhraní, jiný způsob ovládání a mnoho dalších změn, například odlišný způsob distribuce aplikací (pomocí centralizovaného marketplace). Narozdíl od svého předchůdce, který mířil hlavně na pokročilé uživatele a firemní použití, se Windows Phone 7 aktuálně zaměřuje především na spotřebitelskou část trhu. Klade důraz na jednoduché ovládání, na hry a multimédia. Obsahuje ale i pokročilejší funkce, jako například synchronizaci e-mailů s více Exchange účty najednou.

Windows-Phone-7.jpg

Protože je to zatím úplně nový systém, má ještě určitá omezení, například to, že z České republiky ještě nemáme možnost nákupu aplikací. To by se ale mělo snad v blízké budoucnosti měnit a měli bychom se dočkat i dalších novinek, jako například pohodlnějšího přepínání aplikací v telefonu nebo možnosti jejich běhu na pozadí. Určitě se už proto vyplatí o této platformě začít uvažovat, případně si už začít zkoušet programovat vlastní aplikace nebo hry. Jakmile se možnost nahrávání aplikací do marketplace otevře i pro naši republiku, budete už připraveni a třeba se vám na nich, díky rostoucímu zájmu lidí, podaří vydělat nějaké pěkné peníze.

Všechny Windows Phone 7 zařízení mají v současné době dané striktní hardwarové požadavky, jak mají vypadat. Každý telefon musí obsahovat tři tlačítka na přední straně – pro návrat na hlavní obrazovku, provedení kroku zpět a pro spuštění vyhledávání. Displeje mají standardizované rozlišení 800x480 pixelů a podporují alespoň čtyři dotyky najednou. V telefonech se nachází výkonný procesor, grafická karta a dostatek RAM paměti. To vše přispívá k většímu pohodlí pro vývojáře, kdy nemusí trávit tolik času laděním aplikací pro různá zařízení, ale mohou se spolehnout na jednotné prostředí. Grafické rozhraní Metro, které se v systému nachází, bylo od začátku navrženo pro ovládání prsty. Inspirací mu byly informační tabule a piktogramy v dopravních prostředcích. Klade důraz na typografii, jednoduché a jasné podání informací.

Programování pro Windows Phone 7

Pro tyto zařízení se dá aktuálně programovat dvěma způsoby. Pro vytváření běžných aplikací slouží technologie Silverlight, známá především jako plugin do webových prohlížečů. Hodí se k vytváření interaktivních aplikací plných animací a vektorové grafiky, využívajících připojení k internetu a podobně. Podrobněji jsem se o ní rozepsal ve svém dřívějším článku na serveru SmartMania.cz. Tady bych se chtěl věnovat především druhé technologii – XNA, vhodné pro poměrně snadné vytváření výkonných 2D a 3D her.

 Silverlight logo.jpg

Obě technologie jsou postavené nad .NET Frameworkem, v současné době se dá v nich programovat pomocí jazyků C#, Visual Basic.NET a F#. Což znamená, že například narozdíl od nativního vývoje v jazyce C++, zde máme k dispozici Garbage Collector, který se nám stará o správnou dealokaci objektů. I když si pořád musíme dávat pozor, jak některé věci v kódu píšeme, vývoj je mnohem jednodušší, rychlejší a méně náchylný na chyby. Jako další výhodu lze považovat to, že námi napsaný kód jen s drobnými úpravami poběží bez problémů i na dalších zařízeních podporujících .NET, například na počítačích nebo herních konzolích Xbox 360. V případě Silverlightu bude moci být spouštěn s doinstalovaným pluginem i přímo ve většině webových prohlížečů.

 XNA logo.png

Jedinou nevýhodou toho, že se pro Windows Phone 7 už nedá psát v nativním kódu, je, že se na těchto telefonech už nedají spouštět původní aplikace napsané pro starší Windows Mobile. Microsoft se rozhodl ukončit problémy, které se nesly s Windows Mobile po několik generací, a Windows Phone 7 poskládal znovu od začátku. Každá aplikace nyní například běží v odděleném prostředí, aby nemohla zasahovat do zbytku systému a v případě svého pádu si ho “nevzala s sebou”. Všechny aplikace také před nahrátím do marketplace podléhají schvalování. To všechno bylo navrženo za účelem co největší stability systému. V budoucnu možná dojde k uvolnění některých požadavků, současná podoba je ale navržená poměrně rozumně (z pohledu běžného uživatele, který očekává bezproblémové zařízení, nebo vývojáře, který by chtěl aplikace dobře prodávat).

XNA Framework

XNA je framework určený čistě pro tvorbu her, je postavený nad technologií DirectX. Snaží se zjednodušit práci vývojářům a přinést jim možnost programování stejným způsobem pro telefony, herní konzole i počítače. Vývojáři jsou odstíněni od nízkoúrovňových záležitostí, nemusí složitě řešit načítání obrázků a modelů ze souborů nebo správné obnovování vykreslovacího okna. Mají k dispozici předpřipravenou herní smyčku, metody pro načítání dat nebo aktualizace stavu hry. V XNA jsou přístupné funkce pro přehrávání hudby, rozpoznávání gest na displeji nebo pro matematické výpočty s vektory a maticemi.

Pokud si budeme chtít vytvářet vlastní hru, většinou se vydáme jedním ze dvou směrů – budeme tvořit 2D nebo 3D hru. Jednoduché 2D hry s vektorovou grafikou by se daly naprogramovat i pomocí Silverlightu, na cokoliv pokročilejšího nám ale přijde vhod právě XNA. Když si budeme chtít náš herní level skládat z mnoha malých obrázků, využijeme třídu SpriteBatch. Ta nám zaručí, aby se vždy všechny obrázky odeslaly na grafickou kartu najednou a byl tím ušetřen výkon. Můžeme zde také nastavit, jak by měly být tyto obrázky řazené, jestli podle textur, nebo například podle jejich pořadí odpředu dozadu. Jednotlivé obrázky můžeme mít uložené i včetně poloprůhlednosti, můžeme si je například načítat do hry přímo z připravených .png souborů. Často je vhodné si z výkonnostních důvodů nejdříve uložit více obrázků do jednoho velkého a teprve z něj potom vykreslovat.

XNA se ale výborně hodí i pro vytváření 3D her, kdy scénu nemáme složenou z jednotlivých obrázků, ale jakoby se koukáme kamerou na prostorový svět. S touto virtuální kamerou se můžeme po scéně pohybovat, objekty se mohou navzájem překrývat, některé mohou být skryté za námi, takže je přímo neuvidíme. Stejně jako ve všech 3D hrách, se nám v důsledku každá scéna skládá jen z jednotlivých trojúhelníčků, které mají určenou barvu, pozici, případně nastavenou nějakou texturu. Každý snímek se potom tyto informace posílají na grafickou kartu. Tyto herní objekty si můžeme bod po bodu skládat od začátku sami a generovat si tak například kopcovitý terén, nebo bludiště s náhodným tvarem. Častěji ale využijeme možnost, že si do XNA jednoduše načteme modely už vytvořené v nějakém 3D editoru, například v Blenderu nebo v placeném 3D Studiu Max a potom budeme operovat přímo s nimi.

Je potřeba pamatovat, že XNA nám poskytuje zajímavou funkcionalitu a hodně nám ušetří práci, není to ale kompletní herní 3D engine. Některé pokročilé funkce, jako například počítání stínů, simulaci fyziky apod., si do čistého XNA budeme muset dopsat sami, nebo budeme muset využít již nějakých napsaných komponent. Stejně tak objekt pohybující se virtuální kamery je zde chápaný jako určitá abstrakce, dá se naprogramovat tak, že si budeme vždy podle stisknutých kláves a dotyků na displej nastavovat matici pohledu a projekční matici. Pro programování prostorových her se už hodí znát alespoň nějaké základy 3D grafiky.

Ve 3D prostředí máme také mnoho prostoru pro optimalizace, pro uložení objektů ve scéně si můžeme například naprogramovat různé datové struktury, jako octree nebo quadtree. Ty se snaží o to, aby se nám vždy vykreslovaly jen aktuálně viditelné objekty z mnohem rozsáhlejší scény a neutrpěl tím výkon. Stejně tak můžeme řešit řazení objektů odpředu dozadu (aby se nemusely zbytečně překreslovat stejné pixely několikrát), nebo například podle stejných textur. Zvlášť můžeme například řešit poloprůhledné objekty, aby se zobrazovaly správně (ty se většinou musí řadit naopak odzadu dopředu, pomocí některé varianty malířova algoritmu).

Na Windows Phone 7 jsou všechny hry v XNA akcelerované grafickým čipem. Pochopitelně výkon telefonů zatím stále nejde srovnávat například se současnými herními konzolemi, i tak si ale můžeme při vývoji dovolit poměrně hodně. Pro odlišení požadavků na parametry grafické karty slouží v XNA profily Reach a HiDef. Dají se přepnout ve vlastnostech projektu. Pro Windows Phone 7 slouží profil Reach, je to striktní podmnožina požadavků, které klade HiDef. Profil Reach očekává grafickou kartu s podporou DirectX 9 a se Shader modelem alespoň 2.0. Jsou zde také další omezení, například na počet vykreslovaných primitiv během jednoho volání, nebo na maximální velikost textur, ale většina z nich je očekávatelná a při vývoji člověka zase tolik nepotrápí.

Pro Windows Phone 7 zatím není možné psát si vlastní shadery v jazyce HLSL. Tato funkcionalita bude nejspíš v blízké době doplněna, zatím bychom si měli vystačit bez nich. S příchodem XNA verze 4.0 přišlo ale několik předpřipravených efektů, které můžeme ve svých projektech využít. Asi nejužitečnější je DualTextureEffect, pomocí kterého si můžeme na objektech vykreslovat například předpočítané stíny. Tyto lightmapy se dají předgenerovat buď v nějakém 3D editoru, nebo si je můžeme předpočítávat z kódu vždy na začátku hry. Vykreslování těchto stínů nám potom téměř nijak nezpomalí snímkovací frekvenci hry. Dále zde máme k dispozici efekt pro jednoduché odlesky, pomocí kterého se dá nasimulovat kovový povrch materiálu, nebo například efekt pro vykreslování mnoha stejných modelů najednou, jen na různých místech. Použití těchto efektů bychom neměli moc nepřehánět, ale pro nějaké obzvláštnění hry nám poslouží dobře.

Windows-Phone-7 logo.jpg

Ve Windows Phone 7 je standardně renderování omezeno na 30 snímků za sekundu. Víc by, vzhledem k použití v mobilním zařízení, nepřineslo až takový efekt, jen by zbytečně vybíjelo baterii. Pokud máme složitou herní scénu a vykreslování nám běží pomalu, můžeme si pomoci ještě jedním trikem. Můžeme hře nastavit nižší rozlišení, od 240x240 do plných 800x480 pixelů. Toto zmenšování je na telefonech implementováno hardwarově a nijak nezpomaluje grafickou kartu. Můžeme si všimnout, že pokud nepatrně zmenšíme rozlišení na 600x360, bude potřeba renderovat jen cca 56% potřebných pixelů.

Určitě by se dalo vymyslet mnoho dalších optimalizací, kterými by se daly vylepšit naše hry. Neměli bychom alokovat v každém snímku mnoho zbytečných objektů a přidělávat tak práci Garbage Collectoru. Také bychom si měli dát obecně pozor na použití průhlednosti, zvlášť při velkém počtu poloprůhledných objektů ve 3D scéně a jejich nutnému řazení by mohlo dojít k velkému zpomalení. Textury u objektů by měly mít šířku a výšku o velikosti mocniny dvojky a neměly by být zbytečně velké. Měli bychom co nejvíce optimalizovat veškerý pohyb dat na grafickou kartu.

Vývojové nástroje

Vývojové nástroje pro Windows Phone 7 jsou k dispozici zdarma (i pro komerční účely), můžete si je stáhnout ze stránek App Hub. V tomto balíčku dostanete vývojové prostředí Visual Studio Express, emulátor telefonu a vektorový grafický editor Expression Blend. Pokud jste ještě student, můžete si stáhnout z Dreamsparku plnou verzi Visual Studia Professional. Pro běžný vývoj ale plně postačí i základní verze Express.

dotnet logo.jpg

Pro další informace v češtině se můžete podívat například na sérii článků, kterou jsem psal spolu se Štěpánem Pazderkou pro server CzechGamer.cz. Jsou tam popisované základy XNA, 3D grafiky a gamedesignu, společně tam vytváříme dvě hry. Díky multiplatformnosti XNA budou tyto příklady fungovat i na telefonech s Windows Phone 7. Aby vám to správně fungovalo, mělo by stačit jen nahradit několik řádků vstupu z klávesnice, starajícího se o pohyb hlavního hrdiny, například za klikání na displej, nebo za ovládání pohybovým senzorem pomocí naklápění zařízení.

Autor: Tomáš Slavíček

Články ze série Microsoft TechNet nevytváří redakce Živě.cz, ale partneři programu Microsoft TechNet. Jsou publikovány v rámci mediálního partnerství Živě.cz a společnosti Microsoft.

Diskuze (21) Další článek: Thunderbird 3.3: Co přináší třetí alpha verze?

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,