elektronika, chemie, pokusy, hammer, medvědi
Nadpis whitebear

White bear elektronika, chemie, pokusy, hammer, medvědi

Optimalizace mapy

28. Července 2010

Používání materiálu nodraw
Používání materiálu nodraw

Každý začátečník, který vytváří svou mapu, se snaží získat výsledek co nejrychleji. Dělá brushe ledabyle, aplikuje na ně materiály ze všech stran stejné a není pečlivý při dotahování. Na malých mapách ale nepoznáte, že toto všechno má špatný vliv na konečný výkon.

Leak

Leak (v překladu díra nebo skulina) je místo v mapě kde je “díra do prázdna“. Engine half-life 2 (ep1, ep2, portal, …) musí mít mapy doslova hermeticky uzavřené aby dokázal rozpoznat, kde je vnitřek mapy a kde je venek (černé prázdno které můžete vidět když pomocí noclip opustíte prostor mapy).

“Konstrukce” leaku

Typy leaků:
1. Typ – Klasický leak nejčastěji vzniká nepozorným stylem mapovaní. Během tvorby mapy někde necháte nedotažený brush a vznikne tak díra (velká klidně i jeden dílek nejmenšího gridu), která spojí vnitřek mapy s černým prázdnem.
2. Typ – Leaku je entita mimo vnitřní prostor mapy. Například po smazání nějaké nepovedené části mapy vám zůstane v prázdnu entita Light.
3. Typ – Leaku je střed entity vyčnívající mimo prostor mapy. Nejčastěji se s tímto setkáte u modelů, když budete potřebovat použít jen část modelu a zbytek schovat do zdi a při tom se střed modelu dostane mimo prostor mapy. (Model může vyčnívat mimo mapu, ale jeho střed musí zůstat uvnitř.)
4. Typ – Leaku vzniká při pokusu uzavřít mapu pomocí Displacement, Func_detailvodou. Tyto tři věci nedokáží mapu uzavřít a musí se použít v kombinaci s NODRAW.
5. Typ – Leaku způsobuje opět střed entity mimo mapu, v tomto případě ale nemyslím model ale např. Func_door, který má také střed (malý bílý kroužek uprostřed). Střed se musí vždy nacházet uvnitř prostoru mapy.
6. Typ – Je spojený s konstrukcí Func_areaportal. Pokud areaportal neuzavírá hermeticky části mapy, které dělí, vzniká na něm leak.
7. Typ – Způsobuje použití průhledných materiálů v místě, kde by bylo zkrz brush vidět do prázdna nebo zpět za areaportal.

Odhalení leaku

Pokud máte v mapě leak, tak se v kompilačník okně objeví takovýto řádek:
**** leaked ****
Entity prop_physics (-112.00 -80.00 86.00) leaked!

Hlášení udává název entity prop_physics a její koordináty v mapě (-112.00 -80.00 86.00). Většinou se ale nejedná o entitu, která leak způsobuje, ale o entitu, která je místu s leakem nejblíže. Leak se sice vždy sváže s entitou, ale může se jednat i o díru mezi brushi, entita v tom případě slouží jen jako ukazatel nejbližšího místa. Smazání této entity většinou problém nevyřeší, ale kompilátor jen ukáže na jinou. Příklad kdy by se smazáním problém vyřešil je, když by byla entita umístěna mimo vnitřní prostor mapy.
Když kompilátor najde leak, tak vytvoří soubor pointfile, který po nahrání do hammeru, nakreslí čáru od označené entity zkrz leak do prázdna (nebo na druhou stranu areaportalu)

Pointfile (jménomapy.lin) se nachází v adresáři kde máte mapu uloženou. Pointfile můžete do hammeru načíst přes horní nabídku Map – Load Pointfile. Ve všech 4 pohledech v hammeru se zobrazí červená linka směřující z označené entity k leaku a přes leak do prázdna.
Po opravení leaku, soubor Pointfile odeberete z mapy na stejném místě tlačítkem Unload Poinfile. Najít entitu podle koordinátů lze pokud si kliknete na View v horní nabídce a potom na Go to coordinates….

Dopady leaku

Pokud je v mapě leak, tak proces VBSP nevygeneruje portalfile (jménomapy.prt). Portalfile používá proces VVIS k výpočtu viditelnosti v mapě. Pokud vvis nemá portalfile, nespustí se a nevygeneruje data potřebná pro VRAD. Ten počítá odrazy světla. Bez dat od VVIS, ale nic nespočítá, takže v mapě můžou chybět odlesky. (zůstane tzv. direct lighting – příme osvětlení) Nejlépe je to vidět pokud máte v mapě vodu.
Největší chyba potom vzniká tím, že VVIS nic nespočítá a engine ve hře se potom nemá čím řídit při kreslení levelu a proto ho vykreslí celý. Vede to k chybám v zobrazení. Například se část mapy zobrazí špatně nebo vůbec.

Rychlé hledání leaku

Spouštět pokaždé celou kompilaci, kvůli odhalení leaku se obzvlášť u velkých map nevyplatí, protože kompilace může trvat dlouho. Pro rychlou kontrolu můžete použít následující nastavení kompilátoru (Okno po znáčknutí F9).
Kompilátor s tímto nastavením spočítá jen tu část kompilace, kde se kontrolují leaky. I s obrovskými mapami tato kontrola trvá při nejhorším minutu.
Run VIS: No
Run RAD: No
Don’t run the game after compiling

Řešení leaků

1. Typ – Díru, která způsobuje leak uzavřeme dotažením brushe.
2. Typ – Entitu mimo level přesuneme do vnitřního prostoru. Pokud je pro mapu zbytečná, smažene ji a tím se zbavíme leaku. V případě, že je pro mapu nutná a musí se nacházet mimo vnitřní prostor například info_target, vytvoříme kolem ní brush z materiálu NODRAW. (vysvětleno níže). Tím se zabezpečí, že entita bude uvnitř brushe a nebude způsobovat leak.
3. Typ – Kolem vyčnívající části modelu včetně jeho středu vytvoříme brush z materiálu NODRAW. Tím se zabezpečí, že střed bude v brushi a nebude způsobovat leak.
4. Typ – Vodu, displacement nebo func_detail obtáhneme z venkovní strany brushi z NODRAW tak, aby se leak uzavřel.
5. Typ – Ukazatel středu entity posuneme zpět do vnitřního prostoru mapy, nebo kolem něj vytvoříme brush z NODRAW.
6. Typ – Func_areaportal posuneme nebo obestavíme brushi tak, aby těsnil.
7. Typ – Použitím neprůhledného materiálu leak odstraníme.

NODRAW

Pro optimální výkon mapy je žádoucí zobrazovat jen to, co může hráč při hraní mapy vidět. Vše ostatní, co vidět není, plynulost mapy zhoršuje včetně zobrazování stran brushů, které nemohou být spatřeny. Za účelem “schování” nepotřebných stran brushů hammer nabízí materiál NODRAW. Strany s tímto materiálem kompilátor vynechává a ve hře se nekreslí, což podstatně ulehčuje práci engine při počítání grafiky. NODRAW je sice v mapě průhledný, ale materiál NODRAW je fyzicky pevný, to znamená, že do brushe z NODRAW můžete narazit a fyzika s ním počítá. Z toho plyne jeho velká výhoda, můžete s ním utěsňovat Leaky aniž byste příliš zatěžovali engine kreslením dalšího brushe, protože NODRAW se nekreslí.

Přidám příklad z vlastní zkušenosti. V době kdy jsem nevěděl o nodraw, mohla moje největší, možná, hratelná mapa zabírat cca jednu pětinu mapovacího prostoru. Dále už se tolik sekala, že nebylo možné ji rozumně hrát. Po aplikování nodraw na všechny zbytečné strany brushů, které nejsou vidět, se plynulost mapy výrazně zlepšila. Po použití dalších optimalizačních technik, které jsou popsány v dalších článcích, jsem schopen vytvořit mapu, která zabírá mnohonásobně větší prostor a přesto je na stejném počítači dokonale plynule hratelná.

Používání NODRAW

Techniky pro NODRAW které používám jsou dvě. Buď můžete mapu tvořit z brushů s implicitně nastaveným materiálem NODRAW a poté aplikovat ostatní materiály na strany, které budou vidět. Nebo můžete tvořit mapu z brushů pokrytých materiálem, který chcete použít jako finální (beton, kachličky, …) a potom aplikovat NODRAW na strany, které vidět nebudou. Vhodnou kombinací obou postupů jste schopni vytvářet mapu spolehlivě a rychle. Důležitý je následný test hotového kusu mapy a ověření, že vše funguje, jak má.

Ostatní články o optimalizaci:

Areaportal
Occluder
Showbudget