Az mindenki számára evidens, hogy a játéklogikát függetleníteni kell a rendereléstől, és ehhez nem elég, hogy 1 / fps-el felszorzol, mert instabil (átugrálsz a falon). Az engine a kezdetektől fogva 10 ups-en updatelte az állapotokat, rendereléskor pedig lineárisan interpolált (ahogy azt kell).
A baj csak annyi, hogy 10 ups-re volt belőve, azaz ha gyorsabban akartam updatelni (pl. az új fizikai engine miatt), akkor minden annyiszor gyorsabb lett. A feladat, hogy legalább az engine által nyújtott animátor független legyen az update rátától is.
Ez egy jó alkalom volt arra, hogy a timert is kicsit átbuheráljam. Double-el számolni jó dolog, de a nagy pontosságú órák minden platformon 64 bites integert adnak vissza; márpedig azzal számolva sokkal pontosabb lehet a logika ütemezése (és remélem, hogy a némely gépeken előforduló periodikus megakadás is megszűnik ezáltal).
Amit meg kell jegyezni, hogy Mac-en az unsigned long 64 bites (ha arra fordítasz), míg windowson nem. Mac-en egyébként az engine most már csak 64 bitre fordul, ezt egy gyenge pillanatomban csináltam meg, mivel az automatic reference counting csak úgy működik (de a leakes problémáimat nem oldotta meg...).
A refactoring első része tehát az ütemezőt érintette, ahol is a double-öket uint64-re cseréltem le. Ez volt a könnyebbik rész... a második rész viszont egy kapitális szopás volt.
Az animátor ugyanis eddig úgy működött, hogy a [0, 1] intervallumot felosztotta N darab részre; azaz létrehozott egy N elemű tömböt és kiszámolta bele az adott polinom értékeit (ezzel diszkretizálva). Az első verzió az volt, hogy ez maradhat, csak akkor nagyobb N-et kell megadni. Alapvetően jó is, de egyrészt fölöslegesen több memória, másrészt az animációk sebessége szemmel láthatóan eltért ha nagyobb volt a ráta.
Ezt tehát full újraírtam úgy, hogy most már időtartamot vár és nem tárol tömböt. Akkor viszont tudnia kell az update rátát. Ami baromira szar, mert eddig mindig olyan helyen inicializáltam, ahol még nem is volt beállítva. Szóval végig kellett verni az egész enginen.
Amit viszont nem csináltam meg, az a konkrétan 10 ups-től függő dolgok. Lusta módon az 1.7-es demóban az időt nem a timerrel mérem, hanem számolom az update tick-eket. Tehát 60 ups-el 6-szor olyan gyorsan telik az idő. De ez alapvetően nem baj, gondoljunk a Prince of Persia-ban az időlassításra: a játék belassul, de az interfész nem! Ezzel kvázi ingyen megoldható (lenne...sajnos a fizika alapból független...).