Entries from Spalis 2008 ↓

Šefas Mironas

Ką, galvojot, kad aš gykas ir gamint nesugebu ? Ha! Think again. Šiandien ganėtinai sėkmingai implementinau šitą produktą, nusižiūrėtą iš Forelės. Bandymas #1, kodinis pavadinimas “formelės”:

Forminiai sausainiai

Viskas kaip ir gerai, tik formos išsipūtė, susiliejo ir liko vienas didelis blynas. Reikalauju gerb. Forelės pasiaiškinti, kaip jai pavyko padaryti tokias gražias formas :|

Anyways, bandymas #2 – “laikrodis”:

Sausainių laikrodis

Kai sausainiai kūdesni, jau kitas reikalas. O šiaip tai skonis l. geras – Saulius rekomenduoja :>

Computer Science, baby

Neseniai užtikau tokį kodo gabaliuką, kuris jau t’sakant tapo legendinis ir užsiaugino kojytes. Originaliai rastas Quake III source kode, spėkit, ką jis daro:

Inverse Square Root

Teisingai, apskaičiuoja 1/šaknis(x) ! :> Tik tai daro ~4 kartus greičiau nei paprastas 1/sqrt(x) ir tik su 0.1% paklaida. Nesunku suprast, kodėl šitas daiktas toks greitas – nė vienos dalybos ar floating point operacijos, o tik daugyba ir bitų stumdymas.

Iki galo neįsigilinau, kaip šitas daiktas veikia, bet esmė tokia: floating point skaičius nukastinamas į int’ą, tada pastumiant bitus per vieną į dešinę padalinamas iš dviejų – turint omeny, kaip išdėstyti float tipo skaičiaus bitai (pasak IEEE 754-1985), tai atitinka laipsnio padalinimui iš dviejų, dar pridedam minuso ženklą ir gaunam primityvų 1/šaknis(x) variantą. Aišku, pasistūmė ir mantisės bitai – čia į pagalbą ateina ta magiška konstanta, kurios prasmę norint suprasti reiktų perskaityti pilną 12 puslapių išvedimą. Atlikus šitą apytikslį (bet ganėtinai gerą) spėjimą, rezultatas dar patikslinamas viena Niutono metodo iteracija.

Nors nesu žaidimų developeris, galiu suprast, kodėl tokią funkciją apsimoka taip optimizuot – su ja atliekamas vektorių normavimas, o įtariu, kad tokiam geime, kaip Quake III, tai daroma milijardus kartų per sekundę. Tai do the math, ant kiek šita optimizacija atsiliepia overall performance’ui.

Žodžiu, vat čia aš skaitau yra tikrasis computer science :>