Optimalizace hry vytvořené v GameMakeru

Ostatní jazyky GameMaker Základy Optimalizace hry vytvořené v GameMakeru

Jelikož vykreslovací engine není zrovna silnou stránkou GameMakeru, je důležité, aby vaše hra neobsahovala zbytečnosti, které ji zpomalují a kazí tak herní prožitek jejím hráčům. Sepsal jsem čtyři základní chyby, které nejvíce ovlivní rychlost výsledné hry a které zejména nováčci v GameMakeru často přehlíží.

 

Rozlišujte mezi Objektem a Tile

Většina lidí (včetně mne) má tendenci brát každou věc v místnosti jako objekt. Ono to samozřejmě tak brát lze, ale pak se naskýtá problém. Objekt je v GameMakeru brán jako něco, co něco dělá (vykresluje sprite, počítá své kolize, kontroluje své události, vykonává akce a spoustu dalších věcí). Když chceme ve hře něco interaktivního (postavičku, letící střelu nebo rozbitelný předmět), samozřejmě to musí být objekt. Pokud ale potřebujeme neaktivní věci jako strom, použijeme TILE. Tile je odvozeno od slova dláždit a jak název vypovídá, je to prvek, který se jen vykresluje a je navržen tak, aby hru nezpomaloval a v místnosti mohlo být tilů stovky. Když si totiž podlahu (nebo i neaktivní části pozadí) ve hře vydláždíte pomocí Tile (záložka v room editoru), bude fungovat několikrát rychleji a mít menší nároky, než když každá kostka podlahy bude objekt, který se nejen vykresluje, ale počítá se pro něj další kvantum jiných věcí.

Používání Tiles v GameMaker

Zde uvádím několik příkladů použití tiles (použil jsem tiles ze Super Maria jako ukázku). Na obrázku vidíte, že Supermário a dělo musí být objekty, protože jsou aktivní (Mario běhá a dělo střílí). Cihličky těsně pod Mariem musí být objekty také, protože je jim potřeba nastavit vlastnost solid, aby přes ně Mario nepropadával. Ale cihličky v další řadě již nejsou přístupné a proto jsou Tile, stejně jako květinka, která nedělá nic jiného, než že se vykresluje, případně animuje.

Používejte vlastnost Image_speed

Když vytvoříte objekt a přiřadíte mu sprite, ve kterém je více, než 1 obrázek, bude se animovat. Problém je v tom, že moc rychle. Mnoho začátečníků toto řeší tak, že tupě nakopírují ten samý obrázek několikrát zasebou, aby animaci zpomalili. Tato technika sice funguje, ale vaše hra bude mít několikrát větší velikost a paměťovou náročnost. Pro tyto účely existuje proměnná image_speed, kterou má každý objekt. Nabývá hodnot 0-1 (nastavíte buď v kódu nebo přes Set Variable) a reguluje rychlost střídání jednotlivých obrázků spritu. Například objekt Mario, který má Mario.image_speed = 0.5 se bude animovat 2x pomaleji, než kdybyste tuto hodnotu nenastavili. Výchozí hodnota je 1.

Používání image_speed v GameMakeru

Horní obrázek je špatně, protože zabírá 2x více paměti, než je třeba.

Pozor na step událost

Pozor na to, co objekty vaší hry vykonávají v události Step. Provádí se totiž opravdu KAŽDÝ krok (hra standardně provede 30 kroků za sekundu pro každý objekt). Vždy se zamyslete, zda se ona kontrola nebo jakákoli jiná akce musí opravdu provádět tak často.

Nastavujte masku kolize

GameMaker vám u každého nového spritu nastaví jeho masku kolize a to většinou na hodnotu preceise colission checking. To znamená, že objekt bude reagovat se svým okolím přesně podle svého tvaru. Toto je však velmi paměťově náročné a navíc to ve většině případů není potřeba. Například po Mariovi se vysloveně chce, aby se choval jako kostička a také vy byste měli mít u své postavičky nastavenou masku kolize na box. Proč? Protože když máte panáčka všelijak vykrájeného a hýbe se, může se vám stát, že se panáček zastaví tesně před zdí, ale pak změní obrázek a ten už do zdi bude zasahovat. Toto je častá chyba mnoha začátečníků - sekání postaviček v solidních objektech. (dříve měl panáček ruce v bok s tál před zdí, pak rozevřel ruce a ty do zdi přesáhly). Když si panáčka nastavím jako stejně velikou kostičku pro všechny jeho sprity, bude se mi krásně zastavovat před zdí bez ohledu na jeho současný obrázek. Kromě tohoto využítí je dobré box používat na vše, co alespoň trochu připomíná obdelník, takže nevadí, když kolize není úplně stoprocentní - nikdo to nepozná. Nové verze GameMakeru obsahují i další urychlené masky (např. kruh).

Nastavení masky kolize v GameMaker

Na obrázku se obdelník hodí pro střelu a Maria. Naopak pro želvu by vypadalo trapně, kdyby se dala zastřelit na bílých místech a proto precission ponecháme. 


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 



 

 

Komentáře

Avatar
DDL Blue
Neregistrovaný
Avatar
DDL Blue:

No, s tím, že vykreslovací engine u GM za moc nestojí, s tím bych moc nesouhlasil. Ano, je pomalej, ale dá se s tím vcelku slušně kouzlit a pokud člověk umí trochu optimalizovat, dá se grafika slušně vylepšit i s malou náročností. Taky bych ty tily moc nevychvaloval. Zkus si mít v roomu několik stovek tilů, seká se to jako prase ;). Lepší je to v nejhorčím řešit třeba přez surfacy nebo tak nějak.

 
Odpovědět 17.3.2011 21:48
Avatar
sdraco
Tým ITnetwork
Avatar
Odpovídá na DDL Blue
sdraco:

Nevím, na co narážíš, GM je napsaný v Delphi, ty jsou obecně na performance velmi slabé. Autor sám GM nyní z tohoto důvodu přepisuje do C#, takže se rychlost dost zlepší, ale teď je to bída, to pozná snad každý, sice se v tom relativně jednoduše tvoří, ale člověk tam dá pár desítek objektů a už je to zasekané i na čtyřjádru a nejnovější GEForce.
Tile sice nejsou samospásné, ale pořád se vykreslují mnohem mnohem rychleji než objekt, protože s sebou nenese žádnou logiku (funkčnost), která by se musela provádět.
Dobrou praktikou je také sloučit několik tilů do jednoho (místo abych kreslili čtverec 10x10 stejných cihliček, udělám si jeden velký tile 10x10 atd.)
O žádných surface v GM nevím.

Odpovědět 17.3.2011 22:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Satik64
Redaktor
Avatar
Satik64:

Taky nesouhlasím s použitím tiles ve větším počtu. Pokud je jich víc, na rozdíl od objektů se nedají deaktivovat a je to problém. A deaktivace je základ optimalizace ve velkých mapách, není potom problém s počtem objektů. Při správné optimalizaci toho zvládne Game Maker dost. Například není problém použít 3x surface, particle efekty a spoustu vykreslování a FPS se pořád drží mnohem výš, než může být limit rychlosti roomu, a to klidně na starších sestavách, takže na těch ještě horších pak stačí třeba zmírnit množství particlů nebo dalších detailů. Na čtyřjádru a nové Geforce to musí běžet jako nic :)
V něčem je to podle mě i dobře, že to dává vývojářům nějaký limit, kvůli kterému se musí snažit neplýtvat výkonem a hledat co nejúspornější řešení. Ale není to vůbec tak hrozné.

Odpovědět 11.8.2012 23:44
Bůh neobdarovává lidi sny, aniž by jim nedal sílu je uskutečnit.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Satik64
David Čápka:

V čem spočívá deaktivace? Tiles nemají logiku a dle autora GM by se měly používat přesně pro objekty bez logiky.

GM je s optimalizací opravdu hrozný, vezmi si, že na stroji, kde mi běží Quake 3, se mi seká skákačka :) Schválně někdy udělám nějaké porovnání rychlostí XNA a GM ve vykreslování.

Edit: Tiles, ne surface, už napůl spím :)

Odpovědět 11.8.2012 23:48
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Satik64
Redaktor
Avatar
Satik64:

Tak s takovými enginy se to srovnávat nedá, neříkám, že na tom není GM mnohem hůř. Na tak starých sestavách je s GM hrami asi velký problém. Ale myslím, že každý má dnes už PC, který GM krásně zvládne. Sám dělám na 6 let staré sestavě a nemám žádné problémy.
Deaktivace deaktivuje například všechny nedůležité instance mimo view, takže aktivních zůstane mnohem míň objektů.
Tilesy záleží na hře. V malých roomech bych je klidně použil. Pokud bych ale dělal velkou herní mapu nebo level, určitě bych radši využil objekty, které se dají deaktivovat.

Odpovědět 12.8.2012 0:14
Bůh neobdarovává lidi sny, aniž by jim nedal sílu je uskutečnit.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Satik64
David Čápka:

A to se deaktivuje samo nebo to musíš explicitně?

Proč bych ho nemohl srovnávat? GM by naopak měl mít naprosto perfektní engine, když je to vývojový nástroj. Je to program, jako každý jiný, není žádný důvod k tomu, aby byl nekvalitní.

Odpovědět 12.8.2012 0:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Satik64
Redaktor
Avatar
Satik64:

Deaktivaci si musíš napsat.
Malý výkon je nevýhodou jednodušší tvorby. Záleží na výběru, jestli se chce člověk věnovat pokročilým enginům, ale s větším programátorským úsilím, nebo přetrpí tato omezení a zvolí si snadnější cestu. Ale o tom už jsem psal :)

Odpovědět 12.8.2012 11:47
Bůh neobdarovává lidi sny, aniž by jim nedal sílu je uskutečnit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.