Pravidla Ucet
Nepřihlášen

Článek

Menu

Optimalizace GM 3D her
Napsal: Senzi
Přidáno: 20.12. 2010

Návod, jak optimalizovat 3D hry vytvořené v Game Makeru pomocí D3D funkcí


Ahoj lidi. Rozhodl jsem se, že udělám menší tutorial na optimalizaci vašich 3D her vytvořených pomocí d3d funkcí. Nejdřív sem však napíšu trochu keců :D


Řekněme, že optimalizace je něco, díky čemu dosáhneme větších FPS, méně kolísání FPS a snížíme náročnost vašich her na PC.


Že nevíte co je to FPS? V angličtině to znamená frames per second, neboli počet obrázků za sekundu. Čím víc máte FPS, tím rychleji hra poběží. V GM je klasicky v roomu nastaveno max. počet FPS (v GM jako roomspeed) na 30, pokud však chcete víc, otevřete si váš room, klikněte na záložku settings a přepište si hodnotu speed na jakoukoli chcete (max. 9999, to se hodí když chcete dělat nějaký zátěžový test).


Schválně si teď zkuste zapnout vaši zasekanou hru a napište si kolik FPS průměrně máte a poté si nastavte roomspeed na 9999 a pustíme se do optimalizace a po dokončení hru spusťe a určitě uvidíte nějaký rozdíl.



Co nevidí hráč, nemusí se vykreslovat.
Otevřete si nějaký objekt a nastavte mu do create
global.visibility=500;
což je vzdálenost, do jaké se budou všechny modely vykreslovat. Můžete si to klidně změnit podle vaší potřeby. Teď si otevřete jakýkoli objekt, který vykresluje nějaký model (kromě toho hráčového) a otevřete si create
distance_to_player=0; // vzdalenost od objektu k hracovi player_direction_to_me=0; // obraceny smer jakym se diva hrac visible = 1; // urcuje jestli jde model videt alarm[0]=5; // cas za jak dlouho se zkontroluje, jestli jde objekt videt
A teď alarm[0]
distance_to_player=point_distance(x,y,obj_hrac.x,obj_hrac.y) direction_to_player = round(point_direction(x,y,obj_hrac.x,obj_rac.y)); player_direction_to_me= round(abs(obj_hrac.direction)-180); if player_direction_to_me < 0 then player_direction_to_me = 360+player_direction_to_me; // zarizuje, aby nebyla hodnota zaporna if distance_to_player < global.visibility { if player_direction_to_me-50 < direction_to_player and player_direction_to_me+50 > direction_to_player then visible= 1 else visible = 0; } else visible = 0; // cislo 50 si muzete zmenit je to uhel viditelnosti (ale konecny je dvojnasobny, tzn. ze ted by byl 100) if distance_to_player < 40 then visible = 1; // vzalenost kdy jde model videt i bez toho aby se na nej hrac dival alarm[0]=5; // zopakovani kontroly, zda je model videt
Uznávám, že názvy proměnných jsem vymyslel opravdu blbé, ale klidně si je předělejte, to tu nehraje moc roli :) Teď si otevřete draw
if visible = 1 { // sem napiste kod pro vykresleni modelu }
Když teď zapnete hru, modely, na které se nedíváte, se nebudou zobrazovat, což dost pomůže, když máte modely složité.

CULLING -> jednodůché a účinné
Další šikovný kód, který pomůže je d3d_set_culling() a to tak, že "vypne" vykreslování té strany modelu, kterou nevidíme. Pokud však používáte d3d_draw... (např. d3d_draw_block) kódy, je to trochu "složitější" a ty kódy musíte psát správně, jinak vám budou modely blbnout a proto si pamatujte, že všechny modely vykreslujeme takto
d3d_set_culling(1); d3d_draw_block(-x,-y,-z,x,y,z, textura, horizontalni opakovani textury, vertikalni opakovani textury); d3d_set_culling(0);
Což znamená, že -x musí být vždycky menší než x a -y menší než y a -z menší než z, jinak když vykreslíte model a zapnete u něj culling, bude se vám vykreslovat špatná strana modelu...Takže tento kód pište špatně, jedině když to chcete použít například pro "toon outline" (takový ten černý obrys, co je hlavně v "kreslených" hrách).

TOON OUTLINE

Toto nepatří k optimalizaci, ale už jsem se zde o tom zmínil, a tak vám sem rovnou napíšu, že toto taky žere výkon. Můžete se klidně ptát proč a já vám na to jednoduše odpovím: Protože vy sice vykreslíte jen polovinu modelu, ale už jste vykreslili u tu druhou u modelu, tzn. že budete mít skoro celek a to je to, co my právě nechceme, takže tyto obrysy nedávejte naprosto ke všemu. Podle mě stačí třeba jen u postav a třeba ke stromům, skalám, domům a já nevím čemu všemu se stejně moc nehodí.


To jsem tošku odbočil, takže se vraťme zpět k optimalizaci. Už máme zrušenou viditelnost neviditelných objektů (to zní vcelku vtipně :D) a zrušené vykreslování neviditelné strany modelu a teď se pustíme do nečeho jiného, co nevím jak nazvat, ale řekněme tomu třeba



Zjednodušování modelů
Čímž zařídíme, aby modely nebyly zbytečně moc detailní, když jsou od nás daleko. Takže si znovu otevřete nějaký objekt vykreslující model pomocí d3d_draw... (já volím jehlan, jako třeba kmen stromu)
var detailnost; if distance_to_player <= global.visibility/2 then detailnost = 8 else detailnost = 4; // toto je jen priklad, muzete si to klidne zmenit jak chcete d3d_draw_cone(-5,-5,0,5,5,30,textura,1,1,0,detailnost);

Zjednodušené textury
Další menší fígl, jak optimalizovat svou hru, je vykreslování jednodužších textur, pokud je objekt vzdálen natolik, že stejně žádné detaily neuvidíme ani s tou nejostřejší texturou. Takže si otevřete create
det = 1; // toto je velikost textury (1 - velka, 0 - mala) textura[0] = nazev_male_textury; textura[1] = nazev_velke textury; // malou texturu si udelejte pouze zmensenim te puvodni na polovinu
teď step
if distance_to_player <= global.visibility/2 then det = 1 else det = 0; // kontroluje jaka textura se ma vykreslit
a teď zase draw (já to přikládám k tomu kmeni stromu)
var detailnost; if distance_to_player <= global.visibility/2 then detailnost = 8 else detailnost = 4; // toto je jen priklad, muzete si to klidne zmenit jak chcete d3d_draw_cone(-5,-5,0,5,5,30, background_get_texture(textura[det]) ,1,1,0,detailnost);

------ Optimalizace v top-down hře
Toto bude návod, jak jednoduše optimalizovat vaši top-down 3D hru. Ale pozor! Toto můžete použít jedině v tom případě, že nepoužijete kód d3d_set_projection, jen nastavíte ve vašem roomu, že má view sledovat hráče. Tak jdeme na to :) Budeme deaktivovat a znovu aktivovat různé objekty, takže si otevřete objekt hráč, protože ten by podle mě měl být aktivní pořád.


Do step dáme tento kód
instance_deactivate_region(view_xview,view_yview,view_xview+view_wview, view_yview+view_hview,0,1); // deaktivuje vsechny objekty mimo view instance_activate_region(view_xview,view_yview,view_xview+view_wview, view_yview+view_hview,1); // aktivuje vsechny objekty ve viewu
Avšak tu vzniká jeden problém a to ten, že se vám takhle deaktivuje třeba i objekt vykreslující interface. Pro to je tu však neuvěřitelně jednoduché řešení, prostě tomu objektu nastavte do step
x=view_xview+64; y=view_yview+64;
a tím zabráníte, aby objekt z viewu zmizel, a tak se nikdy nedeaktivuje. Jednoduché, že? Ale je tu jeden problém, když chcete, aby nějaký statický (nepohybující se) objekt vykresloval něco pořád, ať je mimo view nebo ne. A řešení je takové, že objektu nastavíte, aby něco vykresloval na pozici xstart a ystart (tzn. na pozici, kde byl objekt vytvořen) a do step mu klidně můžete dát ten kód napsaný výše :)

PS: Děkuji uživateli NicharCZ, že se zde zmínil i o tomto způsobu optimalizace určené hlavně pro top-down hry :)
------

Tak to je odemě pro dnešek asi konec a až zase něco vymyslím, tak to sem dám, ale pokud máte nějaký nápad na něco dalšího, nebo an zdokonalení toho mého, tak klidně napište a já to sem přidám :)
Klíčová slova: game maker d3d optimalizace
 

Komentáře:

Napsal: Kmeto
Přidáno: 03.01. 2011

Celkom slusny clanok. Diki ;)

Trvalý odkaz

Napsal: Senzi
Přidáno: 25.12. 2010

Díky :)

Trvalý odkaz

Napsal: DDL Blue
Přidáno: 22.12. 2010

Senzi: Když dáš u tohodle článku editova, můžeš se kouknout, jak ti to Nichar upravil, aby si pro příště věděl, jak to má vypadat ;) Jinak hezkej tutoriál.

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 22.12. 2010

Pěkný "štýl" nadpis. :)) Zítra, pokud budu mít čas, tak ti ten vzhled klidně upravím. Stačí používat odstavce [p]odstavec[/p] a nový řádek děláš tímhle: #n

Trvalý odkaz

Napsal: Senzi
Přidáno: 21.12. 2010

Ono je to původně na foru, takže tam to vypadá mnohem líp a já jsem tu prakticky poprvé, takež ještě nevím co a jak s tímhle magazínem...

Trvalý odkaz

Napsal: Quadman
Přidáno: 21.12. 2010

Vyzera to fajn, akurat veľmi neprehľadne, takže na tvojom mieste by som to trochu rosekal, dal tam nejake medzery odsekya atď., aby sa to dalo lepšie čítať. ;)

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010