27. 8. 2009

Duch v stroji

Každý z nás, čo v živote aspoň raz sklonený nad klávesnicou vlastnoručne splodil nejaký ten program, kód, hru. Prepis listingu "Pristátie na mesiaci" z časáku. Pozná tu okrídlenú vetu opisujúcu jeden známy nepomer : "hodina programovania, na to pridaj ďalších desať ladenia a vychytávania chýb". Vybral som tu dnes preto zopár príbehov zo života herných vývojárov, ktoré pochopí a ocení aj úplný laik.

----------------

Určite si málokto z váš pamätá RTS hru Force 21. Bola to jedna z tých prvých 3D strategických hier, kde kamera letom svetom kopírovalo pohyb vybranej jednotky. Na konci vývoja sme však zápasili so zvláštnym bugom v programe. Kamera proste odmietala sledovať vybraný cieľ. Pechota odpochodovala, a nič na svete tou kamerou nevedelo pohnúť. Stávalo sa to zúfalo náhodne. Nakoniec si však jeden betatester všimol, že tento jav sa častejšie vyskytuje, ak blízko vašej jednotky dopadajú bomby vzdušného náletu.

Potom to už bolo jednoduché. Kamera bola programovo definovaná, ako "hmotný objekt" s premenlivou rýchlosťou a zrýchlením. Niečo ako tank. Pikantné na to bolo, že tento objekt prebral strojovo aj ich ďalšiu vlastnosť. Deštrukciu po zbombardovaní. Kamera teda bola vlastne náletom - zabitá !!! Aby som sa poistil, nielenže bola táto črta okamžite odstránená, ale navýšil som aj odolnosť a hit pointy našej kamery na tak bezprecedentne vysoké hodnoty, že sa stala nepochybne najodolnejším zariadením svojho druhu v hernej histórii.

----------------

Ako zelenáč priamo zo školy som vhupol rovnými nohami do beta fázy vývoja jednej PC hry. Neskoré roky 90te. Bola to vzrušujúca jazda ako na horskej dráhe. Nakoniec sme to celé dali dokopy, hra vyzerala výborne. Bol tu iba jeden maličký problém. Výrazne sme prekročili pamäťový rozpočet. A pretože značnú časť pamäte zaberali modely objektov a hlavne textúry. Pristúpilo sa ku drastickým redukciám. Niekedy v spolupráci s grafikmi, často cez ich nesúhlasiace mŕtvoly. Obrázky konvertované do nižšieho rozlíšenia, zdecimované herné asety a modely. Kompresia textúr až do ztraty pôvodnej podoby. Megabajt za megabajtom. Až do bodu, keď akýkoľvek rez navyše by znamenal smrteľný zásah do samotnej podstaty hry. Stále sme však boli 1.5 mega cez limit.

V tej chvíli jeden z naších najskúsenejších programátorov, borec čo prežil mnoho rokov v prvej línii zobral celú zálezitosť do svojich rúk. Zavolal ma do svojho šmajchel kabinetu. Očakával som ďalšie totálne vyčerpávajúce sedenie a hľadanie zkrytých rezerv. Namiesto toho však otvoril zdroják a ukázal prstom na jeden riadok.

static char buffer[1024*1024*2];

Pozeraj sa povedal, a jediným pohybom to celé zmazal. Vidiac najhlbší výraz hrôzy v mojich očiach, mi to celé potom vysvetlil. Už na začiatku tie dva megabajty natvrdo rezervoval. Vlastne odložil nabok, zo svojej skúsenosti vediac, že neskôr už nebude tak jednoduché tú pamäť uvoľniť. Takže to dnes praktizuje ako štandardný postup. Potom vyšiel zo svojej kancelárie, a všetkým oznámil, že problém hravo vyriešil. Dav ho oslavoval ako hrdinu celého projektu. Iný progiš, inej hry /Rainbow Six: Lockdown, PS2/postupol presne rovnako. Vždy, keď sa podarilo niečo pamäte v priebehu optimalizacie ušetriť. Časť odložil bokom pre strýčka príhodu a horšie časy. Drvivá časť dev tímu nič netušila.

-----------------

Scéna dobre známa všetkým vývojárom. Hra je odladená, funkčná, proste zlatý kandidát, už to len zabaliť. Popoludní sme v našom už naozaj poslednom builde ešte zbastlili zopár hrateľnosť cizelujúcich drobností. Ešte posledný testík a šokujúce prekvapenie. Hra padá ako hruška. Utekáme naspäť ku svojim pracovným staniciam, zhavíme debug programy. Snažíme sa rýchlo zistiť čo sa deje. Na prvý pohľad tu nič zjavne nebude, diagnostika svieti všade zeleno, aj keď obsah pamäte vyzerá na niektorých miestach veľmi podozrivo. O niekoľko desiatok hodín neskôr, keď už bolo takmer každému jasné, že termín nestihneme, a dôjde ku odkladu hry sme niečo našli.

Jeden súbor v zlom formáte, presnejšie dva rôzne súbory sdieľajú jeden priestor. Ako je to dočerta možné, používame predsa unifikovaný 64 bitový identifikátor, CRC 32 /cyclic redundancy check/ pre názov súboru a CRC 32 pre samotný obsah. Pri desiatkach tisícoch súborov sme ani raz nemali sebemenší problém. Až doteraz. Tým hriešnikom bolo pochopiteľne práve jedno z tých vylepšení na poslednú chvíľu. Nepochopiteľnou náhodou bol jeho názov a CRC kontrola pre dátový obsah úplne rovnaká, ako iná časť zdrojového kódu /pozn. joe, ide o dnes celkom dobre známy problém hash algoritmu, kliknite a pochopíte/. Naše srdcia nám zamrzli a spadli s cinkotom do gatí. Preindexovanie celého kódu by trvalo aspoň celý deň, a v žiadnom prípade nestihneme rannú - definitívnu uzávierku. Potom ako osvietení duchom svätým naplnilo naše vedomie banálne jednoduché riešenie. Otvorili sme ten neštastný súbor /text file/, a na konci sme pridali jeden prázdný SPACE medzerník /pozn. joe - zmenili CRC check, a nedôjde tým pádom ku kolízii s jeho CRC dvajčaťom, hehehe/, celé to uložili a išli sme spať.