Autor: rednek
Název: WE - Leaky
Kvantita dnešných MapMakerov akosi ubúda. Nuž, čo sa dá robiť, warcraft nieje úplne najnovšia hra, raz to prísť muselo...
Na oplátku ale stúpa ich kvalita, úroveň, nazvite to ako chcete. Dneska je v móde, napríklad, robiť vlastné kúzla cez spínače s Periodic Eventom. A či viete, milý moji, že po takýchto špásoch aj upratať po sebe treba?
Ako som už, myslím, v úvode naznačil, tento tutoriál vôbec nieje začiatočníkom určený, ba čo viac, ešte aj popliesť vás môže. Takže ďalej nečítajte a šup šup, chodte nejakú tú kvalitu naberať!
Už sú preč? Výborne... Vám piatim čo ste tu ostali v prvom rade vysvetlím, čo to ten leak (Ostanem pri cudzom slove, pretože slovanské synonymum nepoznám, a pochybujem, že vôbec existuje) vlastne je.
Leak je, keď v pamäti ostáva istá informácia, s ktorou už pracovať nebudeme. A pretože s ňou už pracovať nebudeme, tak tam vôbec nemusí zavadzať, smeť jedna.
Takéto smeti sú samostatne príliš malé na to, aby to vašej RAM-ke vôbec vadilo. Ale ak ich neodstránime hneď pri vzniku, budú sa hromadiť a hromadiť, a to už vám nebude do tanca, veru nie.
Zaleakovaná mapa sa bude dlho vypínať, dlho ukladať, a to nevravím o tom, ako dlho sa bude znova načítavať. Aby toho nebolo málo, skôr či neskôr začne aj lagovať, a veruže to budú CPU lagy (A to, či to bude skôr a či neskôr záleží len od toho, aký silný stroj to v tej debni máte).
Ďalšia vec ktorú vysvetlím je: ako sa tým leakom vlastne vyhnúť...
Leaky vznikajú hlavne pri Lokáciách a Unit/Player Groups. Ďalej sa ešte objavujú pri zvukoch, (občas aj pri) špeciálnych efektoch a iných veciach, s ktorými sa ale nič nedá urobiť. Týmito sa zaoberať nebudeme.
Zakaždým, keď napríklad jednotku niekam posuniete, zapíše sa to "niekam" do RAMky (to niekam napríklad môže byť: center of region, random point in region, target point of issued order... Prakticky čokoľvek). Zvyčajne ho použijete len raz, na maličký moment, ale to hra nemôže vedieť, a tak tam ostane zapísané, až kým ho manuálne nedeletnete.
Events
Time - Every 0.02 seconds of game time
Conditions
Actions
Unit - Move Footman 0000 instantly to (Random point in (Playable map area))
Toto je príklad toho, ako to nemá vyzerať.
V znázornenom spínači sa každých 0.02 sekúnd do pamäte uložia súradnice náhodného bodu na mape. Toto bude mať po hodine hrania docela devastujúce výsledky (šprti už iste vypočítali, že za hodinu sa takýmto tempom do pamäte okrem iného uloží 180000 lokácií, ktoré tam fakt že nemusia byť)
Ako to tedá má byť? Najprv tú lokáciu musíme strepať do premennej, pretože v tvare v akom je uvedená vyššie sa s ňou nedá nijako pracovať.
Po tom, čo jednotku presunieme do tejto "premennej", môžeme lokáciu deletnúť cez JASSovú funkciu. (Tá deletne len lokáciu, nie premennú, takže premennú môžeme naďalej používať)
Events
Time - Every 0.02 seconds of game time
Conditions
Actions
Set PremennaTypuPoint = (Random point in (Playable map area))
Unit - Move Footman 0000 instantly to PremennaTypuPoint
Custom script: call RemoveLocation( udg_PremennaTypuPoint)
Toto je príklad toho, ako to vyzerať má...
Posledná akcia je Custom script, keď dáte New Action, toto je tá, ktorá sa zobrazí ako tretia od vrchu. A do nej už len musíte napísať to call RemoveLocation...
S Unit groups je to úplne to isté, a práve preto si myslím, že nemá zmysel vysvetlovať to do podrobna ako v príklade nad týmto. Takže vám len ukážem, ako by to malo vyzerať:
Events
Time - Every 0.02 seconds of game time
Conditions
Actions
Set JednotkyGroup = (Units in (Playable map area))
Unit Group - Pick every unit in JednotkyGroup and do (Actions)
Loop - Actions
Custom script: call DestroyGroup(udg_JednotkyGroup)
Takže, už chápete prečo vám mamka kázala vynášať smetný kôš, že áno?
Ale ako často je teda potrebné "upratovať"?
Nuž, keď raz v spínači pošlete jednotku niekam, nič sa nedeje. Tá lokácia síce v pamäti zapísaná ostane (leak), ale prakticky to pre RAM-ku nieje žiadna záťaž, a nemusíte strácať čas s Call Remove niečo... (Jedine že ste fakt poriadkumilovný).
Upratujte len vtedy, keď sa vám spínač spúšťa opakovane, každých X sekúnd, alebo zakaždým, keď jednotka začaruje, alebo vždy, keď hero zdvihne item, et cetera...
-red