Istorija apie neįmanomą prievadą: kaip Quake buvo perkeltas į Game Boy Advance

Atrodė, kad „Quake“ perkėlimas į „Game Boy Advance“ būtų buvęs neįmanomas, tačiau Randy'ui Lindenui pavyko tai padaryti. Štai kaip.

„Game Boy Advance“ yra „Nintendo“ sukurta delninė žaidimų konsolė. Jis buvo išleistas Japonijoje 2001 m. ir buvo „Game Boy Color“ įpėdinis. Jame buvo 16,78 MHz ARM7TDMI, 32 kb vidinės darbo RAM, 256 kb išorinės RAM ir 96 kb VRAM. Tai nėra pats galingiausias aparatas, tačiau yra daugybė delniniams kompiuteriams skirtų žaidimų, kuriuos daugelis prisimena. Vienas iš žaidimo, kuris taip ir neišvydo dienos šviesos, buvo „Quake“ prievado prototipas – „id Software“ sukurtas žaidimas, padėjęs apibrėžti šiandien žinomą pirmojo asmens šaudyklės žanrą.

„Quake“ yra neįtikėtinai išsamus žaidimas su fantastišku garso takeliu ir priklausomybę sukeliančiu žaidimu. Jis, kaip ir DOOM, buvo perkeltas į beveik visus įrenginius, apie kuriuos tik galite galvoti. Jo prievadas prie „Game Boy Advance“ yra ypač neįtikėtinas, nes jis iš esmės nepalaiko 3D grafikos, o „Nintendo“ specialiai reklamavo delninį kompiuterį kaip dvimatį žaidimo potyrį. Tačiau tai nesutrukdė Randy'iui Lindenui kurti savo uostą.

„Quake“ prievado nuotrauka, paleista analoginėje kišenėje, naudota gavus „Modern Vintage Gamer“ leidimą

Jei nesate susipažinę su Lindenu, jis geriausiai žinomas kaip abiejų dėmių kūrėjas! („PlayStation“ emuliatorius) ir SNES prievadas DOOM – tai pasiekimas, apie kurį Johnas Romero, vienas iš „id Software“ įkūrėjų, kartą pasakė interviu su Shacknews jis nemanė, kad tai įmanoma. Lindeno tobulėjimo įgūdžiai įrodė, kad jei kas nors galėjo paversti „Quake on Game Boy Advance“ realybe, greičiausiai tai buvo jis.

Šis uostas iškilo dėl to, kad Linden jį išleido per projektą Forest of Illusion. Forest of Illusion yra projektas, skirtas išsaugoti „Nintendo“ žaidimų istoriją ir „Linden“. pasiekė, kad išplatintų Quake prievado kopiją, kurią rado 256 MB atminties kortelėje turėjimas.

Norėtume padėkoti Randy Linden už skirtą laiką atsakant į mūsų klausimus ir užtikrinant techninį šio straipsnio tikslumą. Taip pat norime padėkoti Šiuolaikinis senovinis žaidėjas kad leido mums naudoti bet kokias reikalingas jo vaizdo įrašo nuotraukas. Šis prievadas nėra oficialiai susijęs su id Software ar ZeniMax ir buvo sukurtas kaip individualus Linden projektas.

Quake's Game Boy Advance prievadas

Techniškai kalbant, nuostabu, kad „Quake“ gali pasiekti tokį lygį, kokį pasiekia „Game Boy Advance“. Jis veikia geru kadrų dažniu ir palaiko tinkamą originalaus žaidimo Quake apšvietimą ir spalvų paletę. Viskas yra 3D, įskaitant ginklus ir monstrus. „Game Boy Advance“ žaidimuose buvo pasiekta 3D grafika, paprastai naudojant „spraite“, tačiau tai buvo tikras dalykas. Jame nenaudojamas spindulių perdavimas taip, kaip kiti 3D žaidimai nešiojamuose kompiuteriuose, ir netgi pasiekia tašką apšvietimo efektai iš anksto atvaizduotiems objektams naudojant paletės keitimo triuką, kad būtų sukurta dinamiškumo iliuzija apšvietimas.

Kad būtų aišku, šis prievadas nėra visas žaidimas, o tai prototipas, kurį „Linden“ ketino perkelti į „id Software“, kai jis bus baigtas, kad būtų išleistas. Tačiau „Game Boy Advance“ populiarumas pradėjo blėsti, o vietoj to Linden sukurtas pritaikytas variklis vėliau tapo kito žaidimo, kurį visiškai sukūrė Linden – „Cyboid“, varikliu. Lindenas sako, kad „didelė kodo dalis“ vis dar yra originalus ARM kodas iš „Game Boy Advance“ versijos. Jei norite išbandyti „Cyboid“, senesnę versiją galite rasti „Google Play“ parduotuvėje, tačiau oficialus APK dabar platinamas „Amazon App Store“. nes žaidime yra daug žemo lygio 32 bitų kodo.

KiboidasProgramuotojas: R and R Digital, LLC.

Kaina: Nemokama.

3.3.

parsisiųsti

Lindenas taip pat pasidalino su mumis vaizdo įrašu, kuriame rodomas jo kodas, veikiantis „iPod Video“, kuris buvo viena iš ankstyviausių „Cyboid“ versijų. Jis buvo sukurtas naudojant tą patį variklio kodą, kuris buvo naudojamas jo Quake prievadui į Game Boy Advance.

Game Boy Advance prievade Quake nėra jokio oficialaus žaidimo turto, kaip ir Linden. susisiekė su id Software arba ZeniMax dėl E1M1 versijos, kurioje yra oficialus Quake, platinimo turto.

Šiuo metu platinamas žaidimas taip pat yra derinimo versija. Laikydami nuspaudę R klavišą įkrovos metu, žaidėjas pateksite tiesiai į antrąjį žaidimo žemėlapį, o laikant kairę ant D klaviatūros – į trečiąjį. Žemėlapių keitimas taip pat gali būti pasiekiamas žaidėjui mirus, o monstrai neužpuls žaidėjo, kol žaidėjas pirmas nešaus į juos.

Kalbant apie muziką, demonstracinėje versijoje naudojami vieši .S3M failai, o garso maišytuvas tvarko ir stereo muziką, ir garso efektus.

Techninės ribos

Kalbant apie „Game Boy Advance“, buvo daugybė ribų, dėl kurių tai buvo sudėtinga. Vienos didžiausių kliūčių buvo mažas laikrodžio greitis, delninio kompiuterio 3D grafikos galimybių trūkumas ir slankiojo kablelio (FPU) trūkumas. Pakeliui buvo daug kitų, bet tai buvo ypatingi skausmingi taškai, kuriuos Linden man apibūdino kaip probleminius. Prieš įsigilindami į tai, svarbu suprasti Game Boy Advance išdėstymą.

Ekrano kopija naudota gavus „Modern Vintage Gamer“ leidimą

„Game Boy Advance“ turi tris RAM rinkinius – vienas yra vidinė darbo atmintis (IWRAM), kita – išorinė darbo RAM (EWRAM), trečia – vaizdo RAM (VRAM). 32 kb IWRAM naudojama saugoti ARM instrukcijas, kad būtų galima greitai vykdyti, o 256 kb EWRAM yra optimalus tik nykščio instrukcijoms ir mažesniems duomenų gabalams saugoti. Kaip Rodrigo Copetti pažymi, EWRAM prieiga gali būti iki šešių kartų lėtesnė nei IWRAM. Didžiąją dalį EWRAM formos atminties galima pasiekti tik per 16 bitų magistralę, nepaisant to, kad Game Boy Advance parduodamas kaip 32 bitų delninis kompiuteris. IWRAM galima pasiekti per 32 bitų magistralę. „Game Boy Advance“ VRAM yra 96 ​​kb ir, nors ji pirmiausia skirta grafiniams duomenims saugoti, ji randama procesoriaus atminties žemėlapyje ir taip pat gali būti naudojama kaip įprasta atminties saugykla.

Nykščio instrukcijos yra 32 bitų ARM instrukcijų poaibis ir yra instrukcijų rinkinys, užkoduotas 16 bitų žodžiais. Jie turi visus 32 bitų instrukcijų privalumus, neužimdami tiek daug vietos, todėl yra veiksmingi optimizuojant plėtrą. Tai reiškia, kad nors EWRAM pasiekiama lėčiau, veiksmingos nykščio instrukcijos dažnai gali baigtis taip pat greitai, kaip ir saugomos ARM instrukcijos. IWRAM, nors nykščio instrukcijų trūkumas yra tas, kad kartais nėra visiškai tokio atitikmens, kaip norima ARM instrukcija. vykdyti. EWRAM buvo naudojama 3D matematinės transformacijos logikos išvesties saugojimui, kuri iš esmės buvo daugiakampių briaunų, kurios vėliau buvo atsekamos pagal rastrizacijos kodą, sąrašas.

Kaip pasakoja Lindenas, sudėtingiausia ir sunkiausia viso prievado dalis buvo nuskaitymo linijos atvaizdavimo priemonė. Jį sudaro daugiau nei 10 000 eilučių labai optimizuoto ARM surinkimo kodo, kuris skirtas piešti pikselių rinkinį į VRAM. „Scanline“ atvaizdavimo priemonė išnaudojo didžiąją dalį 32 kb IWRAM. Arčiausiai fotoaparato esantys kraštai yra aktyvūs ir atvaizduojami, o tai iš esmės yra didelis dvejetainio erdvės skaidymo (BSP) medis. VRAM buvo naudojama daugiakampės transformacijos išvesties rezultatams saugoti į kraštines lenteles, nes nebuvo pakankamai IWRAM, tačiau „Game Boy Advance“ VRAM vis tiek yra greitesnė nei EWRAM. Čia taip pat buvo saugoma ir rodoma grafika.

Jis daug laiko skyrė optimizavimui, siekdamas užtikrinti, kad būtų galima gauti greičiausią įmanomą vykdymo laiką. Trys dalykai, kuriuos jis padarė, kad pagreitintų vykdymo laiką, buvo šie:

  • Savarankiškai modifikavo kodą prieš jį vykdant, todėl reikėjo mažiau instrukcijų
  • Naudojo daugybę paieškos lentelių, skirtų tokiems dalykams kaip abipusis, sinusas, kosinusas, tangentas ir kt.
  • Perjungė procesoriaus „režimą“, kad gautumėte prieigą prie papildomų registrų (kurie yra kaip „kintamieji“) neišsaugodami ir neatkuriant registrų reikšmių.

CPU režimų perjungimas norint gauti papildomų registrų yra neįtikėtinai protingas manevras, leidžiantis greitai pasiekti reikšmes, esančias netoli CPU, kad jas būtų galima gauti per vieną laikrodžio ciklą. Kaip pasakoja Lindenas, buvo galima perjungti registrus ir gauti vertę per vieną laikrodžio ciklą, o ne išsaugoti vertę Game Boy Advance RAM atmintyje, kuri užtrunka ilgiau. Pats CPU yra 16,78 MHz procesorius, tai reiškia, kad jis gali atlikti 16780000 ciklų per sekundę. Tai skamba daug, bet kai reikia apskaičiuoti ir nupiešti kiekvieną ekrano pikselį, jie greitai susitraukia ir tampa svarbu nusiskusti kuo daugiau operacijų.

Aukščiau pateiktas bendrųjų ARM7TDMI mikroschemų rinkinio, esančio Game Boy Advance, registrų sąrašas. Paprastai kūrėjai prie registrų prisijungdavo tik „Sistemos ir vartotojo“ režimu ir naudotų įprastus kintamuosius už jo ribų. Tačiau jis naudojo registrus visuose septyniuose mikroschemų rinkinio režimuose, o geriausia tai yra perjungimo režimai vis dar išlaiko reikšmes kitų režimų registruose, todėl jis galėtų perjungti juos.

Smagu, kad Lindenas taip pat paminėjo, kaip jo banko keitimo metodas atskleidė „Nanoboy Advance“ emuliatoriaus klaidą. Kaip paaiškėjo, šis emuliatorius nepalaiko kitų procesoriaus režimų naudojimo registruose ir perjungimui, o jo „Quake“ demonstracinė versija buvo pirmasis žinomas žaidimas, kuris iš tikrųjų tai padarė.

Lindenas pasidalijo su mumis kai kurių savo sukurtų užrašų nuotrauka ir paaiškino, kaip jis optimizavo savo slankiojo kablelio skaičiavimus, kai nebuvo tinkamo FPU.

Aukščiau pateiktas vaizdas yra tas, kuriuo Lindenas pasidalijo su mumis iš savo užrašų, o ypač įdomu yra „įvairūs ARM ciklo instrukcijų skaičiavimai“. Jis sukūrė būdą optimizuoti skaičiavimo ciklus, kad galėtų sumažinti skaičiavimo laikrodžio ciklų skaičių. Kaip jis man apibūdino, 8 bitų skaičių galima padauginti per vieną laikrodžio ciklą, 16 bitų skaičių per du laikrodžio ciklus, 32 bitų skaičių per tris laikrodžio ciklus ir 64 bitų skaičių per keturis laikrodžio ciklus. .

„[ARM procesoriuje] buvo du ar trys vykdymo etapai. Tarkime, aš padauginu registrą vieną iš registro du, o rezultatą įdedu į registrą trys. Jei žinočiau, kad registras du yra 16 bitų skaičius, užuot sakęs registrą padauginti iš registro du, aš apversčiau ir sakyčiau padaugink registrą du iš registro vieno, nes taip sutaupysiu laikrodį ciklas“.

Jis man pasakė, kad priežastis, dėl kurios jis tai padarė, buvo išspausti kiekvieną „Game Boy“ pasirodymą Išankstinis, nes čia ir ten išsaugotas laikrodžio ciklas tikrai padidėja, kai atliekama daug skaičiavimų atlikta. Kalbant apie savaime besikeičiantį kodą, paprašiau Linden paaiškinti.

„Programa ateina iš [saugyklos], ji perkelia didelį programos bloką į vidinę operatyviąją atmintį vykdyti, nes ji yra greitesnė. Kiekviena prieiga prie RAM yra daug, daug lėtesnė, todėl aš darau DMA [tiesioginę prieigą prie atminties] iš didelio bloko iš ROM į RAM ir tada pakeičiau tikrąjį programos kodą. Pavyzdžiui, ARM turi galimybę perkelti operandus į kairę arba į dešinę arba gali užmaskuoti tam tikrus bitus kaip instrukcijų rinkinio dalį. Instrukcija nurodo, kuriuos bitus ketinate užmaskuoti arba kiek bitų pakeisite. Taigi, sugeneruosiu kodą, kuris pakeistų tai, kas buvo ką tik vykdoma, atsižvelgiant į tai, kiek bitų man reikėjo perkelti. Kitas pavyzdys yra susijęs su 3D matricos daugyba. Ten dalyvauja visa krūva dauginimo būdų. Sugeneruosiu tikras instrukcijas, kurios atlieka dauginimą vidinėje RAM, o tada jas vykdyčiau, kad veikiant kodas tarsi sukurtų savo dalis.

Savaime besikeičiantis kodas turi savų minusų, ypač kai kalbama apie derinimą. Tai taip pat pašalina šakinių instrukcijų poreikį, kai kodas pereina į kitą vykdymo seką ir gali atimti iš pagrindinės gijos brangų skaičiavimo laiką. Lindenas taip pat mums papasakojo, kad peržiūros lentelės yra puikiai suderintos ROM, todėl jos yra tobulas aštuonių bitų vertės, perkeltos į kairę, kartotinis. Paieškos lentelės dydis yra didžiulis ir netelpa į RAM, o lygiuojant taip pat išvengiama papildomos įkėlimo instrukcijos, kad būtų gautas pagrindinės lentelės adresas.

Apskritai galutinis prototipas buvo sukurtas beveik dvejus metus.

Randy Lindeno Quake uosto ateitis

Paklausiau Lindeno, kas atsitiks su Quake uosto ateitimi, ir jis man pasakė, kad deda apsvarstyti galimybę paklausti „ZeniMax“ ir „id Software“ apie versijos išleidimą su oficialiu „Quake“. turto. Jis taip pat man pasakė, kad kažkada išleis šaltinio kodą, bet šiuo metu jis nekuriamas, nes reikia senesnio kompiuterio.

Randy Linden sąranka, skirta Game Boy Advance prijungti prie kompiuterio tobulinimo tikslais.

Paklausiau Lindeno, kodėl jis pasirinko Quake, ir jis man pasakė, kad jam patiko šis žaidimas ir jam patiko iššūkis, kaip „neįmanomas projektas“, nes jis buvo už jo DOOM SNES prievado gale. Jis taip pat paminėjo, kad nors jis netiki, kad visas žaidimas galėjo būti perkeltas dėl erdvės apribojimų, didžioji žaidimo dalis galėjo būti tame pačiame variklyje.

Jei norite patikrinti „Quake“, skirtą „Game Boy Advance“, būtinai peržiūrėkite jos leidimą „Forest of Illusion“, kurį galite peržiūrėti toliau.


Parsisiųsti iš Forest of Illusion