Před čtením tohoto článku by se vám mohlo hodit vědět co je to VHLT a co jednotlivé programy dělají (kompilace do hloubky 1,2).
Optimalizace CSG
Když už víme, co CSG dělá, můžeme mu do toho začít fušovat. Konkrétně nám půjde o řezání faců podle hran ostatních faců. Začneme u takové obyčejné věci, kterou jsou schody.
O optimalizaci schodů jsem už něco málo psal - seříznout, převést na func_wall a zbytek vyplnit brushem (nejen aby to nevypadalo divně, ale taky aby nevznikl LEAK). Donedávna by to bylo nejlepší řešení, jenže před týdnem vluzacn vydal novou verzi VHLT, kde přináší jedinečnou novinku - func_detail. Oldschool mapperům bude použití func_detail připomínat techniku odsazení brushe o 1 hu od zdi, jiným zase opaque func_wall. Brushe převedené na tuto "entitu" se po zkompilování stanou opět brushi (huh, tady to skloňování vypadá opravdu zvláštně) s pár odlišnostmi - jejich facy nebudou řezat okolní facy a také nebudou blokovat VIS. Přesto si ale zachovají své výhody ohledně viditelnosti a stínů. Je to taková ideální syntéza func_wall a brushe. Konec básnění, je čas vyměnit func_wall za func_detail:
Povedlo se nám ušetřit 20 wpoly bez žádných vedlejších následků.
Další ožehavá věc ohledně řezání jsou válce:
Řešení je jednoduché - použít func_detail (u func_wall je menší viditelnostní problém) nebo udělat starý trik s podstavcem - mezi válec a zem dáme func_wall (v případě potřeby stínů func_detail). Odsazovat objekty o 1 hu od stěny už dnes neletí.
Stále zmiňuji viditelnostní problém u func_wall - jaktože včera byl žádaným zbožím a dnes ho nechceme ani zadarmo? Vzadu na tomto obrázku vidíme levé schodiště a levý sloup - oba jsou func_wall; pravé schodiště ani pravý sloup nevidíme, protože jsou func_detail. I přes tuto maličkost se nám func_wall hodí na místa, kde chceme ušetřit na výpočtu stínů - různé menší detaily, nebo i samotná svítidla.
Další věc, která by stála za zmínku, jsou skály. U nich bych se neuchyloval k převodu na entitu ani func_detail, jen bych je zarovnal do nějaké rozumné mřížky... cože? Říkáte ze nevidíte důvod pracovat "v mřížce"?
Ještě bych připomenul, že se facy řežou také po určitých úsecích - scale_textury*240 - z čehož vyplývá, že pokud použijeme větší scale textur, snížíme wpoly - kdo by to ale dělal?
Kromě řezání faců má CSG na povel i zahazování zbytečných faců. Tím se dostáváme k nejvíce přeceňované věci zde na webu - NULLování. Co má cenu nullovat?
1. Facy, které jsou zakryté po celé své ploše jiným facem - konkrétněji jen při dotyku entity s entitou, nebo entity s brushem. Když se dotýkají dva brushe, face je zahozen automaticky. U func_detail záleží na nastavení.
2. Vnější facy skyboxu - z brushů tvořící skybox se vytvoří nepotřebná dutina plná zbytečných faců, které se oNULLováním zbavíme.
Rozhodně nemá cenu NULLovat celou mapu. Nedosáhnete tím menšího wpoly, natož rychlejší kompilace (maximálně CSG které stejně trvá v rámci sekund).
Optimalizace VIS
S VISem se už také známe. Ten svou práci většinou odvádí správně. Pokud mu ovšem dáme dobrý materiál ke zpracování. Drtivá většina problémů s VISem je způsobená špatnou koncepcí mapy - pokud máme v mapě rozlehlé spojité oblasti, nebo místnosti se spoustou detailů, nemůžeme se divit vysokému wpoly. Také by se dalo říci, že pokud se na vaší mapě dá sniperovat více než je zdrávo (např. venkovní nebo přespříliš zvětšené mapy), je na vaší mapě i špatný VIS. Klíčem k dobře optimalizované mapě jsou zahnuté chodby, schody a tunely - díky nim můžeme vymýtit místa, odkud je vidět přespříliš velká část mapy.
My se ale se slovem většina nespokojíme - určitě najdeme na naší mapě místo, které bychom mohli manuálně vylepšit.
Všimněte si, že se vykreslují oblasti za schody, které z těch míst nemůžeme nikdy vidět. Naštěstí tu máme dvě magické textury HINT a SKIP, díky kterým můžeme VISu poradit, jak by se nám to líbilo. Záměrně píšu poradit a ne přikázat, protože se jednoduše může stát, že se naše rada zahodí už někde u kompilace CSG / BSP.
Co je vlastně ten HINT a SKIP? V ideálním případě by face s texturou HINT měl vynutit vytvoření VIS portálů na sobě samotném. Protože nám jde jen o jeden face, ostatní facy pokryjeme texturou SKIP - jak již název napovídá, tato textura je k ničemu, facy s touto texturou se zahodí hned při kompilaci CSG.
Uvažujme že VIS v naší mapě vypadá nějak takto - červené oblasti jsou leafy, zelené jsou portály, růžové šipky značí odkuď to vidíme (odevšad vidíme všechno).
Nám by se ale hodilo, abychom přes schody neviděli - toho docílíme horizontálním HINTem (modrá čára)
Po přidání pár dalších HINTů (např. kolem okraje schodiště) získáme kýžené výsledky:
Co říct na závěr? Kompilujte VIS na full a nedělejte prasečiny (anti-leak krychle kolem celé mapy). Pokud si chcete nějakou z věcí popisovaných zde v článku vyzkoušet na vlastním stroji, stahujte příkladovou mapu.
Speciální poděkování patří Welderovi a Marquezovi za překlad článku o optimalizaci fps, který jsem nepoužil kvůli zastaralosti a nedůležitosti některých informací; posloužil alespoň jako inspirace.
|