Prenos Quakea na Game Boy Advance bi se zdel nemogoč, toda Randy Linden je to uspel. Evo kako.
Game Boy Advance je ročna igralna konzola, ki jo je ustvaril Nintendo. Izdan je bil na Japonskem leta 2001 in je bil naslednik Game Boy Color. Imel je ARM7TDMI s taktom 16,78 MHz, 32 kb notranjega delovnega RAM-a, 256 kb zunanjega RAM-a in 96 kb VRAM-a. Ni najzmogljivejši stroj, je pa na voljo ogromno iger za dlančnik, ki so mnogim ostale v lepem spominu. Ena od iger, ki za napravo nikoli ni ugledala luči dneva, je bila prototipna vrata Quakea, igre, ki jo je razvil id Software in je pomagal definirati žanr prvoosebne strelske igre, ki ga poznamo danes.
Quake je neverjetno podrobna igra s fantastičnim zvočnim posnetkom in zasvojljivim igranjem, in tako kot DOOM je bila prenesena na praktično vse naprave, ki si jih lahko zamislite. Njegova povezava z Game Boy Advance je še posebej neverjetna, saj izvorno ne podpira 3D grafike, Nintendo pa je dlančnik posebej tržil kot dvodimenzionalno izkušnjo igranja. Vendar to Randyja Lindena ni ustavilo pri razvoju lastnega pristanišča.
Če Lindena ne poznate, je najbolj znan po tem, da je razvijalec obeh bleem! (emulator PlayStation) in SNES vrata DOOM, dosežek, ki ga je John Romero, soustanovitelj id Software, nekoč dejal v intervjuju za Shacknews se mu ni zdelo možno. Lindenova razvojna usposobljenost je dokazala, da če bo komu uspelo uresničiti Quake na Game Boy Advance, je to verjetno on.
To pristanišče je prišlo na dan zahvaljujoč Lindenovi lastni izdaji v okviru projekta Forest of Illusion. Forest of Illusion je projekt, namenjen ohranjanju zgodovine Nintendovih iger in Linden dosegel, da bi razdelil kopijo vrat Quake, ki jo je našel na 256 MB flash kartici v svojem posest.
Radi bi se zahvalili Randyju Lindenu, ker je posvetil čas odgovarjanju na naša vprašanja in zagotovil tehnično točnost tega članka. Prav tako se zahvaljujemo Sodoben vintage igralec ker nam je dovolil, da uporabimo vse potrebne fotografije iz njegovega videa. Ta vrata nimajo nobene uradne zveze z id Software ali ZeniMax in so jih Linden razvili kot solo projekt.
Pristanišče Quake Game Boy Advance
Tehnično gledano je čudovito, da lahko Quake sploh doseže raven, kot jo ima na Game Boy Advance. Deluje z dobro hitrostjo sličic in ohranja pravilno osvetlitev in barvno paleto izvirne igre Quake. Vse je 3D, vključno z orožjem in pošastmi. Igre na Game Boy Advance so dosegle 3D grafiko običajno s spriti, toda to je bila prava stvar. Ne uporablja oddajanja žarkov na način, kot so to storile druge 3D-igre na dlančniku, in doseže celo točko svetlobni učinki na vnaprej upodobljenih predmetih s trikom spreminjanja palete za doseganje iluzije dinamike osvetlitev.
Da bo jasno, ta vrata niso polna igra, ampak je prototip, ki ga je Linden nameraval prenesti v programsko opremo id, ko bo končan, da bo pripravljen za izdajo. Vendar pa je priljubljenost igre Game Boy Advance začela upadati in namesto tega je motor po meri, ki ga je napisal Linden, kasneje postal motor druge igre, ki jo je v celoti razvil Linden -- Cyboid. Linden nam pove, da je "velik del kode" še vedno izvirna koda ARM iz različice Game Boy Advance. Če želite preizkusiti Cyboid, je starejša različica na voljo v Trgovini Google Play, vendar je uradni APK zdaj razdeljen na Amazon App Store saj ima igra veliko 32-bitne kode na nizki ravni.
Cena: brezplačno.
3.3.
Linden je z nami delil tudi videoposnetek svoje kode, ki se izvaja na iPod Video, ki je služil kot ena najzgodnejših različic Cyboida. Zgrajen je bil na isti kodi motorja, ki je bila uporabljena za njegov prenos Quake na Game Boy Advance.
Pristanišče Game Boy Advance za Quake ne vsebuje nobenih uradnih sredstev igre, saj Linden ni se je obrnil na id Software ali ZeniMax glede distribucije različice E1M1, ki vsebuje uradni Quake sredstev.
Igra, ki se trenutno distribuira, je tudi različica za odpravljanje napak. Če držite tipko R ob zagonu, bo igralec pripeljal naravnost do drugega zemljevida igre, držanje levo na D-padu pa ga bo pripeljalo do tretjega. Do zamenjave zemljevida lahko dostopate tudi, ko igralec umre, in pošasti ne bodo napadle igralca, dokler igralec prvi ne ustreli nanje.
Kar zadeva glasbo, demo uporablja javne datoteke .S3M, mešalnik zvoka pa obravnava stereo glasbo in zvočne učinke.
Tehnične meje
Ko je šlo za Game Boy Advance, so bile številne meje, zaradi katerih je bilo to težko pristanišče. Nekatere največje ovire so bile nizek takt, pomanjkanje 3D grafičnih zmogljivosti dlančnika in pomanjkanje enote s plavajočo vejico (FPU). Na poti je bilo veliko drugih, toda to so bile posebne boleče točke, ki mi jih je Linden opisal kot problematične. Preden se lotimo tega, je pomembno razumeti postavitev Game Boy Advance.
Game Boy Advance ima tri sklope RAM-a -- eden je notranji delovni RAM (IWRAM), drugi je zunanji delovni RAM (EWRAM) in tretji je video RAM (VRAM). 32 kb IWRAM se uporablja za shranjevanje navodil ARM za hitro izvedbo, medtem ko je 256 kb EWRAM optimalno za shranjevanje ukazov samo Thumb in manjših kosov podatkov. Kot Opombe Rodriga Copettija, je lahko dostop do EWRAM-a do šestkrat počasnejši od IWRAM-a. Večina pomnilnika v obliki EWRAM je dostopna le prek 16-bitnega vodila, kljub temu, da se Game Boy Advance trži kot 32-bitni dlančnik. Do IWRAM-a je bilo mogoče dostopati prek 32-bitnega vodila. VRAM na Game Boy Advance ima 96 kb in čeprav je namenjen predvsem shranjevanju grafičnih podatkov, ga najdemo v pomnilniški karti CPE in ga je mogoče uporabiti tudi kot običajni pomnilnik.
Palčeva navodila so podmnožica 32-bitnih navodil ARM in so niz navodil, kodiranih v 16-bitne besede. Imajo vse prednosti 32-bitnih navodil, ne da bi zavzeli veliko prostora, zaradi česar so učinkoviti za optimiziran razvoj. To pomeni, da čeprav je dostop do EWRAM-a počasnejši, so lahko navodila Thumb, ki so učinkovita, pogosto še vedno enako hitra kot shranjena navodila ARM v IWRAM, čeprav je slaba stran ukazov Thumb ta, da včasih ni povsem enakovrednega ukaza ARM Thumb, ki bi ga želeli izvršiti. EWRAM je bil uporabljen za shranjevanje izhoda logike 3D matematičnega preoblikovanja, ki je bil v bistvu seznam robov mnogokotnikov, ki jih je nato koda za rastriranje izrisala skenirano vrstico za skenirano vrstico.
Kot mi pravi Linden, je bil najkompleksnejši in najtežji del celotnega pristanišča upodabljalnik scanline. Sestavljen je iz več kot 10.000 vrstic visoko optimizirane montažne kode ARM, ki je zasnovana za risanje niza slikovnih pik v VRAM. Upodabljalnik scanline je porabil večino 32kb IWRAM. Robovi, ki so najbližje kameri, so aktivni in upodobljeni, v bistvu pa gre za veliko drevo razdelitve binarnega prostora (BSP). VRAM je bil uporabljen za shranjevanje rezultatov poligonalne transformacije v robne tabele, ker ni bilo dovolj IWRAM-a, vendar je VRAM na Game Boy Advance še vedno hitrejši od EWRAM-a. Tu so bile shranjene in razstavljene tudi grafike.
Veliko časa je porabil za osredotočanje na optimizacije, da bi zagotovil najhitrejši možni čas izvajanja. Tri stvari, ki jih je naredil, da bi pospešil ta čas izvedbe, so vključevale naslednje:
- Sam je spremenil kodo, preden je bila izvedena, zato je bilo potrebnih manj navodil
- Uporabil je niz iskalnih tabel za stvari, kot so recipročna vrednost, sinus, kosinus, tangens itd.
- Preklopil je "način" CPU za dostop do dodatnih registrov (ki so kot "spremenljivke"), ne da bi bilo treba shraniti in obnoviti vrednosti registrov.
Preklapljanje načinov CPE za pridobivanje dodatnih registrov je neverjetno pameten manever, ki omogoča hiter dostop do vrednosti blizu CPE, tako da jih je mogoče pridobiti v enem samem taktu. Kot mi pravi Linden, je bilo mogoče zamenjati registre in pridobiti vrednost v enem taktu, v nasprotju s shranjevanjem vrednosti v RAM Game Boy Advance, ki traja dlje. Sam CPE je 16,78 MHz procesor, kar pomeni, da lahko opravi 16780000 ciklov na sekundo. To se sliši veliko, toda ko morate izračunati in narisati vsako slikovno piko na zaslonu, se te hitro seštejejo in postane pomembno, da zmanjšate čim več operacij.
Zgoraj je seznam splošnih registrov nabora čipov ARM7TDMI, ki je znotraj Game Boy Advance. Običajno bi razvijalci dostopali do registrov samo v načinu "Sistem in uporabnik" in se zatekli k uporabi običajnih spremenljivk zunaj tega. Vendar pa je uporabil registre v vseh sedmih načinih nabora čipov in najboljše pri tem je, da preklopni načini še vedno ohranjajo vrednosti v registrih drugih načinov, tako da je lahko preklapljal med njimi njim.
Smešno je, da je Linden tudi omenil, kako je njegova metoda zamenjave banke odkrila napako v emulatorju Nanoboy Advance. Kot se je izkazalo, ta emulator ni podpiral uporabe drugih načinov procesorja za shranjevanje v registre in preklapljanje, njegova demo Quake pa je bila prva znana igra, ki je to dejansko storila.
Linden je z nami delil fotografijo nekaterih zapiskov, ki jih je ustvaril, in pojasnil, kako je optimiziral svoje izračune s plavajočo vejico brez ustreznega FPU.
Zgornja slika je tista, ki jo je Linden delil z nami iz svojih zapiskov, in kar je še posebej zanimivo, so "razna navodila cikla ARM štejejo". Zasnoval je način za optimizacijo ciklov za izračune, tako da je lahko zmanjšal število taktov za izračun. Kot mi je opisal, je mogoče 8-bitno število pomnožiti v enem taktu, 16-bitno število v dveh taktih, 32-bitno število v treh taktih in 64-bitno število v štirih taktih. .
"Bile so dve ali tri stopnje izvajanja [v procesorju ARM]. Recimo, da na primer pomnožim register ena z registrom dva in dam rezultat v register tri. Če bi vedel, da je register dva 16-bitno število, namesto da rečem pomnoži register ena z registrom dva, bi bi ga obrnil in rekel bi, da pomnoži register dva z registrom ena, ker bi mi to prihranilo uro cikel."
Rekel mi je, da je to storil zato, da iz Game Boya iztisne vse zmogljivosti Vnaprej, saj se tu in tam shranjeni urni cikel res poveča, ko se izvaja veliko izračunov izvedel. Kar zadeva kodo, ki se sama spreminja, sem prosil Lindena, naj jo razloži.
"Program prihaja iz [shrambe], prenese velik blok programa v notranji RAM za izvajanje, ker je hitrejši. Vsak dostop do RAM-a je veliko, veliko počasnejši, zato naredim DMA [neposredni dostop do pomnilnika] velikega bloka iz ROM-a v RAM in nato spremenim dejansko programsko kodo. Na primer, ARM ima možnost premikanja operandov levo ali desno ali pa lahko prikrije določene bite kot del nabora ukazov. Navodilo določa, katere bite boste maskirali ali za koliko bitov boste premaknili. Ustvaril bi torej kodo, ki bi spremenila tisto, kar se bo pravkar izvedlo, glede na to, koliko bitov moram premakniti. Drug primer je v zvezi s 3D matričnim množenjem. Tam je vključenih cel kup množenja. Ustvaril bi dejanska navodila, ki izvajajo množenja v notranji RAM, in jih nato izvedel, tako da je koda med izvajanjem nekakšno sestavljala dele same sebe."
Samospreminjanje kode ima svoje slabe strani, zlasti ko gre za odpravljanje napak. Odpravlja tudi potrebo po navodilih za razvejanje, kjer bi koda skočila na drugo izvršilno zaporedje in lahko glavno nit prikrajšala za dragocen računski čas. Linden nam je tudi povedal, da so iskalne tabele v ROM-u popolnoma poravnane, tako da so popoln večkratnik osembitne vrednosti, pomaknjene v levo. Velikost iskalne tabele je ogromna in se ne prilega v RAM, s poravnavo pa se tudi izognemo potrebi po dodatnem navodilu za nalaganje, da bi dobili osnovni naslov tabele.
Skratka, končni prototip je bil razvit skoraj dve leti.
Prihodnost pristanišča Quake Randyja Lindena
Vprašal sem Lindena, kaj se bo zgodilo s prihodnostjo pristanišča Quake, in rekel mi je, da namerava vprašati ZeniMax in id Software o izdaji različice z uradnim Quakeom sredstev. Povedal mi je tudi, da bo na neki točki izdal izvorno kodo, vendar je trenutno ne gradijo, ker zahteva starejši računalnik.
Vprašal sem Lindena, zakaj je izbral Quake, in rekel mi je, da mu je všeč igra in da mu je bil všeč izziv, da je to "nemogoč projekt", saj je bil na zadnji strani njegovega DOOM za SNES port. Omenil je tudi, da čeprav ne verjame, da bi celotno igro lahko prenesli zaradi prostorskih omejitev, bi lahko bila velika večina igre v istem motorju.
Če vas zanima Quake za Game Boy Advance, si oglejte njegovo izdajo na Forest of Illusion, ki si jo lahko ogledate spodaj.
Prenesite iz Forest of Illusion