Quake'i teisaldamine Game Boy Advance'ile oleks tundunud võimatu, kuid Randy Linden suutis selle ära teha. Siin on, kuidas.
Game Boy Advance on Nintendo loodud pihuarvuti mängukonsool. See ilmus Jaapanis 2001. aastal ja oli Game Boy Colori järeltulija. Sellel oli ARM7TDMI, mille taktsagedus oli 16,78 MHz, 32 kb sisemist töömälu, 256 kb välist RAM-i ja 96 kb VRAM-i. See pole küll kõige võimsam masin, kuid pihuarvutite jaoks on palju mänge, mida paljud mäletavad. Üks mäng, mis selle seadme jaoks siiski ilmavalgust ei näinud, oli Quake'i prototüüpport – id Software poolt välja töötatud mäng, mis aitas määratleda tänapäeval tuntud esimese isiku tulistamisžanri.
Quake on uskumatult detailne mäng, millel on fantastiline heliriba ja sõltuvust tekitav mänguviis ning nagu DOOM, on see porditud praktiliselt igasse seadmesse, mis teile ette tuleb. Selle port Game Boy Advance'i on eriti uskumatu, kuna see ei toeta algselt 3D-graafikat ja Nintendo turustas pihuarvutit spetsiaalselt kahemõõtmelise mängukogemusena. See aga ei takistanud Randy Lindenil oma sadamat arendamast.
Kui te pole Lindeniga tuttav, on ta tuntud mõlema bleemi arendajana! (PlayStationi emulaator) ja DOOM-i SNES-i port – saavutus, mida John Romero, id Software kaasasutaja, ütles kunagi intervjuus Shacknews ta ei pidanud võimalikuks. Lindeni arendusoskused tõestasid, et kui keegi suutis Quake'i Game Boy Advance'il reaalsuseks muuta, oli see tõenäoliselt tema.
See sadam on päevavalgele tulnud tänu Lindeni enda vabastamisele selle projekti Forest of Illusion kaudu. Forest of Illusion on projekt, mille eesmärk on säilitada Nintendo mängude ajalugu ja Linden võttis ühendust, et levitada Quake'i pordi koopiat, mille ta leidis oma 256 MB välkmälukaardilt omamine.
Täname Randy Lindenit, et pühendas aega meie küsimustele vastamisele ja selle artikli tehnilise täpsuse tagamisele. Samuti soovime tänada Kaasaegne Vintage Gamer et lubas meil kasutada tema videost mis tahes vajalikke kaadreid. Sellel portil ei ole ametlikku seost id Software ega ZeniMaxiga ning selle töötas välja Linden sooloprojektina.
Quake'i Game Boy Advance'i port
Tehniliselt öeldes on ime, et Quake suudab isegi Game Boy Advance'i tasemele jõuda. See töötab hea kaadrisagedusega ning säilitab algse Quake'i mängu õige valgustuse ja värvipaleti. Kõik on 3D, sealhulgas relvad ja koletised. Game Boy Advance'i mängud saavutasid 3D-graafika tavaliselt spraitide kaudu, kuid see oli tõeline tehing. See ei kasuta kiirte edastamist nii, nagu muud 3D-mängud pihuarvutis kasutasid, ja see saavutab isegi punkti valgusefektid eelrenderdatud objektidele kaubaaluse muutmise triki abil, et saavutada dünaamilisuse illusioon valgustus.
Et olla selge, see port ei ole täismäng ja see on prototüüp, mille Linden kavatses pärast valmimist vabastamiseks ID-tarkvarasse üle viia. Game Boy Advance'i populaarsus hakkas aga kahanema ja selle asemel sai Lindeni kirjutatud kohandatud mootorist hiljem täielikult Lindeni välja töötatud mootor - Cyboid. Linden ütleb meile, et "suur osa koodist" on endiselt Game Boy Advance'i versiooni algne ARM-kood. Kui soovite Cyboidi proovida, on Google Play poes saadaval vanem versioon, kuid ametlikku APK-d levitatakse nüüd Amazon App Store kuna mängus on palju madalatasemelist 32-bitist koodi.
Hind: tasuta.
3.3.
Linden jagas meiega ka videot oma koodist, mis töötab iPod Videos, mis oli üks Cyboidi varasemaid versioone. See ehitati samale mootorikoodile, mida kasutati tema Quake'i pordi jaoks Game Boy Advance'i jaoks.
Quake'i Game Boy Advance'i port ei sisalda ühtegi mängu ametlikku vara, kuna Linden pole seda teinud pöördus ametlikku Quake'i sisaldava E1M1 versiooni levitamise küsimuses id Software'i või ZeniMaxi poole varasid.
Praegu levitatav mäng on samuti silumisversioon. R-klahvi all hoidmine käivitamisel viib mängija otse mängu teisele kaardile ja D-padi vasakut hoidmine viib ta kolmandale. Kaardivahetust saab kasutada ka siis, kui mängija sureb ja koletised ei ründa mängijat enne, kui mängija nende pihta tulistab.
Mis puutub muusikasse, siis demo kasutab avalikke .S3M faile ja helimikser tegeleb nii stereomuusika kui ka heliefektidega.
Tehnilised piirid
Game Boy Advance'i puhul oli mitmeid piire, mis muutsid selle keeruliseks pordiks. Mõned suurimad takistused olid madal taktsagedus, pihuarvuti 3D-graafikavõimaluste puudumine ja ujukomaseadme (FPU) puudumine. Teel oli palju teisi, kuid need olid konkreetsed valupunktid, mida Linden nimetas minu jaoks problemaatiliseks. Enne selle juurde asumist on oluline mõista Game Boy Advance'i paigutust.
Game Boy Advance'il on kolm RAM-i komplekti - üks on sisemine töö-RAM (IWRAM), teine on väline töö-RAM (EWRAM) ja kolmas on video-RAM (VRAM). 32 kb suurust IWRAM-i kasutatakse ARM-i käskude salvestamiseks kiireks täitmiseks, samas kui 256 kb EWRAM-i on optimaalne ainult pöialkäskude ja väiksemate andmehulkade salvestamiseks. Nagu Rodrigo Copetti märgib, EWRAM-ile juurdepääs võib olla kuni kuus korda aeglasem kui IWRAM-ile. Enamikule EWRAM-i kujul olevast mälust on juurdepääs ainult 16-bitise siini kaudu, hoolimata sellest, et Game Boy Advance'i turustatakse 32-bitise pihuarvutina. IWRAM-ile pääses juurde 32-bitise siini kaudu. Game Boy Advance'i VRAM on 96 kb ja kuigi see on peamiselt mõeldud graafikaandmete salvestamiseks, leidub see protsessori mälukaardil ja seda saab kasutada ka tavalise mälusalvestusena.
Pöidla käsud on 32-bitiste ARM-i käskude alamhulk ja 16-bitisteks sõnadeks kodeeritud käskude komplekt. Neil on kõik 32-bitiste käskude eelised, ilma et nad võtaksid nii palju ruumi, muutes need optimeeritud arenduse jaoks tõhusaks. See tähendab, et kuigi EWRAM-ile on juurdepääs aeglasem, võivad tõhusad pöidlajuhised sageli jõuda sama kiiresti kui salvestatud ARM-i juhised. IWRAM-is, kuigi Pöidla juhiste negatiivne külg on see, et mõnikord ei ole Pöidla ekvivalendit ARM-i juhistele, mida soovite hukata. EWRAM-i kasutati 3D matemaatika teisendusloogika väljundi salvestamiseks, mis kujutas endast põhiliselt hulknurga servade loendit, mida seejärel rasterdamiskoodi abil skaneeriti skaneeringu kaupa.
Nagu Linden mulle ütleb, oli kogu pordi kõige keerulisem ja raskem osa scanline'i renderdaja. See koosneb enam kui 10 000 reast väga optimeeritud ARM-i koostekoodist, mis on loodud pikslite komplekti joonistamiseks VRAM-i. Scanline'i renderdaja kasutas ära suurema osa 32 kb IWRAM-ist. Kaamerale lähimad servad on aktiivsed ja renderdatud ning see on sisuliselt suur binaarruumi jaotamise (BSP) puu. VRAM-i kasutati hulknurkse teisenduse väljundi tulemuste salvestamiseks servatabelitesse, kuna IWRAM-i polnud piisavalt, kuid Game Boy Advance'i VRAM on siiski kiirem kui EWRAM. Siin hoiti ja kuvati ka graafikat.
Ta kulutas palju aega optimeerimisele keskendudes, et tagada võimalikult kiire täitmisaeg. Kolm asja, mida ta selle täitmisaja kiirendamiseks tegi, olid järgmised:
- Muutis koodi ise enne selle käivitamist, mistõttu oli vaja vähem juhiseid
- Kasutas mitmeid otsingutabeleid selliste asjade jaoks nagu retsiprooks, siinus, koosinus, puutuja jne.
- Lülitas CPU "režiimi", et pääseda juurde täiendavatele registritele (mis on nagu "muutujad"), ilma et oleks vaja salvestada ja taastada registrite väärtusi.
Protsessori režiimide vahetamine täiendavate registrite saamiseks on uskumatult nutikas manööver, mis võimaldab kiiret juurdepääsu CPU-le lähedastele väärtustele, nii et neid saab ühe taktitsükli jooksul hankida. Nagu Linden mulle ütleb, oli võimalik registreid vahetada ja väärtust hankida ühe taktitsükli jooksul, mitte Game Boy Advance'i RAM-i väärtuse salvestamisel, mis võtab kauem aega. Protsessor ise on 16,78 MHz protsessor, mis tähendab, et see suudab sooritada 16780000 tsüklit sekundis. See kõlab palju, kuid kui teil on vaja arvutada ja joonistada kõik ekraanil olevad pikslid, liidetakse need kiiresti kokku ja on oluline raseerida võimalikult palju toiminguid.
Ülaltoodud on Game Boy Advance'i sees oleva ARM7TDMI kiibistiku üldregistrite loend. Tavaliselt pääsevad arendajad registritele juurde ainult režiimis "Süsteem ja kasutaja" ning kasutavad tavalisi muutujaid väljaspool seda. Siiski kasutas ta registreid kiibistiku kõigis seitsmes režiimis ja selle parim osa on see režiimide vahetamine säilitab endiselt väärtused teiste režiimide registrites, nii et ta saaks vaheldumisi vahetada neid.
Naljakalt mainis Linden ka seda, kuidas tema pangavahetuse meetod avastas Nanoboy Advance'i emulaatoris vea. Nagu selgus, ei toetanud see emulaator CPU teiste režiimide kasutamist registritesse salvestamiseks ja ümberlülitamiseks ning tema Quake'i demo oli esimene teadaolev mäng, mis seda tegelikult tegi.
Linden jagas meiega fotot mõnest enda loodud märkmest ja selgitas, kuidas ta optimeeris oma ujukomaarvutusi korraliku FPU puudumisel.
Ülaltoodud pilt on see, mida Linden meiega oma märkmete põhjal jagas, ja mis on eriti huvitav, on "Mitmesugused ARM-i tsükli juhised loevad". Ta töötas välja meetodi arvutuste tsüklite optimeerimiseks, nii et ta saaks arvutuse jaoks kella tsüklite arvu vähendada. Nagu ta seda mulle kirjeldas, saab 8-bitise arvu korrutada ühe taktitsükliga, 16-bitist arvu kahe taktitsükliga, 32-bitist arvu kolme taktitsükliga ja 64-bitist arvu nelja taktitsükliga. .
"[ARM-protsessoris] oli kaks või kolm täitmisetappi. Ütleme näiteks, et ma korrutan registri ühe registri kahega ja panen tulemuse registrisse kolm. Kui ma teaksin, et register kaks on 16-bitine arv, selle asemel, et öelda registri ühe korrutamine registriga kaks, siis ma keeraks selle ümber ja ma ütleksin, et korrutage registri kaks registriga ühega, sest see säästaks mulle kella tsükkel."
Ta ütles mulle, et põhjus, miks ta seda tegi, oli Game Boyst iga jõudluse väljapressimine Avanss, kuna siin-seal salvestatud kella tsükkel tõesti lisandub, kui tehakse palju arvutusi sooritatud. Mis puutub isemuutuvasse koodi, siis palusin Lindenil seda selgitada.
"Programm pärineb [salvest], see kannab täitmiseks suure programmiploki sisemisse RAM-i, kuna see on kiirem. Iga juurdepääs RAM-ile on palju-palju aeglasem, nii et ma teen DMA [Otsemälu juurdepääs] suure ploki ROM-ist RAM-i ja seejärel muudan tegelikku programmikoodi. Näiteks on ARM-il võimalus nihutada operande vasakule või paremale või maskeerida teatud bitte käsukomplekti osana. Juhend täpsustab, milliseid bitte kavatsete maskeerida või mitu bitti nihutate. Seega genereeriksin koodi, mis muudaks just käivitatavat selle põhjal, mitu bitti mul oli vaja nihutada. Teine näide puudutab 3D-maatriksi korrutamist. Seal on seotud terve hulk korrutamist. Ma genereeriksin tegelikud juhised, mis korrutavad sisemisse RAM-i, ja seejärel käivitaksin need nii, et kood moodustaks töötamise ajal enda osad."
Isemuutuval koodil on oma varjuküljed, eriti kui tegemist on silumisega. See eemaldab vajaduse ka harukäskude järele, kus kood hüppab teisele täitmisjadale ja võib peamise lõime väärtuslikust arvutusajast ilma jätta. Linden rääkis meile ka, et otsingutabelid on ROM-is ideaalselt joondatud, nii et need on vasakule nihutatud kaheksabitise väärtuse täiuslik kordne. Otsingutabeli suurus on tohutu ja ei mahu RAM-i ning joondamine väldib ka täiendava laadimisjuhise vajadust tabeli baasaadressi saamiseks.
Kokkuvõttes töötati lõplik prototüüp välja peaaegu kahe aasta jooksul.
Randy Lindeni Quake'i sadama tulevik
Küsisin Lindenilt, mis saab Quake'i sadama tulevikuga, ja ta ütles mulle, et paneb kaaluda, kas küsida ZeniMaxilt ja id Software'ilt versiooni ametliku Quake'iga avaldamise kohta varasid. Samuti ütles ta mulle mingil hetkel, et avaldab lähtekoodi, kuid praegu seda ei ehitata, kuna see nõuab vanemat arvutit.
Küsisin Lindenilt, miks ta Quake'i valis, ja ta ütles mulle, et talle meeldis see mäng ja talle meeldis väljakutse olla "võimatu projekt", kuna see oli tema DOOM for SNES pordi tagaküljel. Ta mainis ka, et kuigi ta ei usu, et kogu mängu oleks ruumipiirangute tõttu võimalik teisaldada, oleks suurem osa mängust võinud olla samas mootoris.
Kui olete huvitatud Quake'ist Game Boy Advance'i jaoks, vaadake kindlasti selle väljalaset Forest of Illusion'is, mida saate vaadata allpool.
Laadige alla Forest of Illusionist