Quaken siirtäminen Game Boy Advanceen olisi vaikuttanut mahdottomalta, mutta Randy Linden onnistui saamaan sen irti. Toimi näin.
Game Boy Advance on Nintendon kehittämä kädessä pidettävä pelikonsoli. Se julkaistiin Japanissa vuonna 2001 ja toimi Game Boy Colorin seuraajana. Siinä oli ARM7TDMI kellotaajuudella 16,78 MHz, 32 kb sisäistä työmuistia, 256 kb ulkoista RAM-muistia ja 96 kb VRAM. Se ei ole tehokkain kone, mutta kämmentietokoneille on paljon pelejä, jotka monet säilyttävät mielellään. Yksi peli, joka ei kuitenkaan koskaan nähnyt päivänvaloa laitteelle, oli Quaken prototyyppiportti, id Softwaren kehittämä peli, joka auttoi määrittelemään tänään tuntemamme ensimmäisen persoonan räiskintälajin.
Quake on uskomattoman yksityiskohtainen peli, jossa on fantastinen ääniraita ja koukuttava pelattavuus, ja aivan kuten DOOM, se on siirretty käytännössä kaikkiin laitteisiin, joita voit kuvitella. Sen portti Game Boy Advanceen on erityisen uskomaton, koska se ei tue natiivisti 3D-grafiikkaa, ja Nintendo markkinoi kämmenlaitetta erityisesti kaksiulotteisena pelikokemuksena. Se ei kuitenkaan estänyt Randy Lindeniä kehittämästä omaa porttiaan.
Jos Linden ei ole sinulle tuttu, hän tunnetaan parhaiten molempien bleemien kehittäjänä! (PlayStation-emulaattori) ja DOOMin SNES-portti, saavutus, jonka John Romero, id Softwaren perustaja, sanoi kerran haastattelussa Shacknews hän ei pitänyt mahdollisena. Lindenin kehitystaito osoitti, että jos joku aikoi tehdä Quaken Game Boy Advancesta totta, se oli luultavasti hän.
Tämä portti on tullut ilmi Lindenin oman julkaisun ansiosta Forest of Illusion -projektin kautta. Forest of Illusion on projekti, jonka tavoitteena on säilyttää Nintendon pelien ja Lindenin historia otti yhteyttä voidakseen jakaa Quake-portin kopion, jonka hän löysi 256 Mt: n flash-kortilta hallinta.
Haluamme kiittää Randy Lindeniä siitä, että hän käytti aikaa vastatakseen kysymyksiimme ja varmistaakseen tämän artikkelin teknisen tarkkuuden. Haluamme myös kiittää Moderni Vintage Gamer siitä, että saimme käyttää kaikkia tarvittavia still-kuvia hänen videostaan. Tällä portilla ei ole virallista yhteyttä id Softwareen tai ZeniMaxiin, ja sen kehitti Linden yksinprojektina.
Quaken Game Boy Advance -portti
Teknisesti sanottuna on ihme, että Quake pystyy jopa saavuttamaan Game Boy Advancen tasolla. Se toimii hyvällä kuvanopeudella ja säilyttää alkuperäisen Quake-pelin oikean valaistuksen ja väripaletin. Kaikki on 3D: tä, mukaan lukien aseet ja hirviöt. Game Boy Advancen pelit saavuttivat 3D-grafiikkaa tyypillisesti spritien avulla, mutta tämä oli todellinen juttu. Se ei hyödynnä säteen heittämistä samalla tavalla kuin muut 3D-pelit kämmentietokoneessa, ja se jopa saavuttaa pisteen valotehosteet esirenderöityihin objekteihin paletinvaihtotempun avulla dynaamisen illuusion saavuttamiseksi valaistus.
Selvyyden vuoksi tämä portti ei ole koko peli, ja se on prototyyppi, jonka Linden aikoi viedä id Softwareen sen valmistuttua julkaisua varten. Game Boy Advancen suosio alkoi kuitenkin hiipua, ja sen sijaan Lindenin kirjoittamasta räätälöidystä moottorista tuli myöhemmin Lindenin kokonaan kehittämän pelin moottori - Cyboid. Linden kertoo, että "suuri osa koodista" on edelleen alkuperäinen ARM-koodi Game Boy Advance -versiosta. Jos haluat kokeilla Cyboidia, vanhempi versio on saatavilla Google Play Kaupasta, mutta virallinen APK on nyt jaettu Amazon App Store koska pelissä on paljon matalan tason 32-bittistä koodia.
Hinta: Ilmainen.
3.3.
Linden jakoi meille myös videon koodistaan iPod Videossa, joka oli yksi Cyboidin vanhimmista versioista. Se rakennettiin samalle moottorikoodille, jota käytettiin hänen Quake-portissaan Game Boy Advanceen.
Quaken Game Boy Advance -portti ei sisällä mitään pelin virallista omaisuutta, kuten Linden ei ole otti yhteyttä joko id Softwareen tai ZeniMaxiin virallisen Quaken sisältävän E1M1-version jakelusta omaisuutta.
Tällä hetkellä jaettava peli on myös virheenkorjausversio. R-näppäimen pitäminen painettuna käynnistämisen aikana tuo pelaajan suoraan pelin toiselle kartalle ja D-padin vasemman painikkeen painaminen vie hänet kolmanteen karttaan. Kartan vaihto on mahdollista myös pelaajan kuoltua, eivätkä hirviöt hyökkää pelaajaa vastaan ennen kuin pelaaja ampuu niitä ensin.
Musiikin osalta demo käyttää julkisia .S3M-tiedostoja ja äänimikseri käsittelee sekä stereomusiikkia että äänitehosteita.
Tekniset rajat
Game Boy Advancessa oli useita rajoja, jotka tekivät tästä vaikean portin. Suurimpia esteitä olivat alhainen kellonopeus, kämmenlaitteen 3D-grafiikkaominaisuuksien puute ja liukulukuyksikön (FPU) puute. Matkan varrella oli paljon muita, mutta nämä olivat erityisiä kipukohtia, jotka Linden hahmotteli minulle ongelmallisiksi. Ennen kuin pääsemme siihen, on tärkeää ymmärtää Game Boy Advancen ulkoasu.
Game Boy Advancessa on kolme sarjaa RAM-muistia - yksi on sisäinen työ-RAM (IWRAM), toinen on ulkoinen työmuisti (EWRAM) ja kolmas on video-RAM (VRAM). 32 kilotavua IWRAM-muistia käytetään ARM-käskyjen tallentamiseen nopeaa suorittamista varten, kun taas 256 kilotavua EWRAM-muistia on optimaalinen vain peukalon käskyjen ja pienempien tietopalojen tallentamiseen. Kuten Rodrigo Copetti huomauttaa, EWRAM voi olla jopa kuusi kertaa hitaampi käyttää kuin IWRAM. Suurin osa EWRAM-muistista on käytettävissä vain 16-bittisen väylän kautta, vaikka Game Boy Advancea markkinoidaan 32-bittisenä kämmenlaitteena. IWRAM-muistiin pääsee käsiksi 32-bittisen väylän kautta. Game Boy Advancen VRAM-muisti on 96 kt, ja vaikka se on ensisijaisesti tarkoitettu grafiikkatietojen tallentamiseen, se löytyy CPU: n muistikartalta ja sitä voidaan käyttää myös normaalina muistitallennustilana.
Peukalokäskyt ovat 32-bittisten ARM-käskyjen osajoukko, ja ne ovat joukko ohjeita, jotka on koodattu 16-bittisiksi sanoiksi. Niissä on kaikki 32-bittisten käskyjen edut viemättä niin paljon tilaa, mikä tekee niistä tehokkaita optimoidun kehityksen kannalta. Tämä tarkoittaa, että vaikka EWRAM-muistiin pääsy on hitaampaa, tehokkaat peukaloohjeet voivat usein silti päätyä yhtä nopeasti kuin tallennetut ARM-ohjeet. IWRAMissa, vaikka Peukalo-ohjeiden haittapuoli on, että joskus ei ole aivan samanlaista Peukaloa kuin ARM-käsky, jonka haluat suorittaa. EWRAM-muistia käytettiin 3D-matemaattisen muunnoslogiikan tulosteen tallentamiseen, joka oli pohjimmiltaan luettelo monikulmion reunoista, jotka sitten jäljitettiin skannausviiva kerrallaan rasterointikoodilla.
Kuten Linden kertoo, koko portin monimutkaisin ja vaikein osa oli scanline-renderöijä. Se koostuu yli 10 000 rivistä erittäin optimoitua ARM-kokoonpanokoodia, joka on suunniteltu piirtämään joukko pikseleitä VRAM: iin. Scanline-renderöijä käytti suurimman osan 32 kt: n IWRAM-muistista. Kameraa lähimpänä olevat reunat ovat aktiivisia ja renderöityjä, ja se on pohjimmiltaan suuri BSP (Binary Space Partitioning) -puu. VRAM-muistia käytettiin monikulmiomuunnostulosten tulosten tallentamiseen reunataulukoihin, koska IWRAM-muistia ei ollut tarpeeksi, mutta Game Boy Advancen VRAM on silti nopeampi kuin EWRAM. Grafiikat myös tallennettiin ja näytettiin täällä.
Hän vietti paljon aikaa keskittyen optimointiin varmistaakseen, että se pystyi saamaan nopeimman mahdollisen suoritusajan. Kolme asiaa, joita hän teki nopeuttaakseen suoritusaikaa, olivat seuraavat:
- Muokkasi koodia itse ennen sen suorittamista, joten tarvittiin vähemmän ohjeita
- Käytti sarjaa hakutaulukoita asioille, kuten käänteisarvo, sini, kosini, tangentti jne.
- Vaihdettiin CPU: n "tilaa" päästäkseen käsiksi lisärekistereihin (jotka ovat kuin "muuttujia") tarvitsematta tallentaa ja palauttaa rekisterien arvoja.
CPU-tilojen vaihtaminen lisärekisterien saamiseksi on uskomattoman näppärä toimenpide, joka mahdollistaa nopean pääsyn CPU: ta lähellä oleviin arvoihin, jotta ne voidaan hakea yhdellä kellojaksolla. Kuten Linden kertoo, oli mahdollista vaihtaa rekistereitä ja noutaa arvo yhdellä kellojaksolla, toisin kuin Game Boy Advancen RAM-muistiin tallentamiseen, mikä kestää kauemmin. Prosessori itsessään on 16,78 MHz: n prosessori, mikä tarkoittaa, että se pystyy suorittamaan 16780000 sykliä sekunnissa. Se kuulostaa paljon, mutta kun sinun täytyy laskea ja piirtää jokainen pikseliä näytölle, ne kasvavat nopeasti ja on tärkeää poistaa mahdollisimman monta toimintoa.
Yllä oleva on luettelo Game Boy Advancen sisällä olevan ARM7TDMI-piirisarjan yleisistä rekistereistä. Tyypillisesti kehittäjät käyttävät rekistereitä vain "Järjestelmä ja käyttäjä" -tilassa ja turvautuvat normaaleihin muuttujiin sen ulkopuolella. Hän kuitenkin käytti rekistereitä piirisarjan kaikissa seitsemässä tilassa, ja parasta siinä on se Vaihtotilat säilyttävät edelleen arvot muiden moodien rekistereissä, jotta hän voisi vaihtaa välillä niitä.
Hassua kyllä, Linden mainitsi myös kuinka hänen pankinvaihtotapansa paljasti virheen Nanoboy Advance -emulaattorissa. Kuten kävi ilmi, tuo emulaattori ei tukenut CPU: n muiden tilojen käyttöä rekistereihin tallentamiseen ja vaihtamiseen, ja hänen Quake-demonsa oli ensimmäinen tunnettu peli, joka todella teki sen.
Linden jakoi meille valokuvan joistakin luomistaan muistiinpanoista ja selitti, kuinka hän optimoi liukulukulaskelmansa ilman oikeanlaista FPU: ta.
Yllä oleva kuva on yksi, jonka Linden jakoi meille muistiinpanoistaan, ja mikä on erityisen mielenkiintoista, on "sekalaiset ARM-syklien ohjemäärät". Hän kehitti tavan optimoida syklit laskelmia varten, jotta hän voisi vähentää kellojaksojen määrää laskennassa. Kuten hän kuvaili minulle, 8-bittinen luku voidaan kertoa yhdellä kellojaksolla, 16-bittinen luku kahdella kellojaksolla, 32-bittinen luku kolmella kellojaksolla ja 64-bittinen luku neljällä kellojaksolla. .
"[ARM-prosessorissa] oli kaksi tai kolme suoritusvaihetta. Oletetaan esimerkiksi, että kerron rekisterin yksi rekisteriin kaksi ja laitan tuloksen rekisteriin kolme. Jos tietäisin, että rekisteri kaksi on 16-bittinen luku sen sijaan, että sanoisin, että kerrotaan rekisteri yksi rekisterillä kaksi, minä kääntäisin sen ja sanoisin, että kerroin kaksi rekisteriä yhdellä, koska se säästäisi kellon sykli."
Hän kertoi minulle, että syy, miksi hän teki tämän, oli puristaa Game Boysta kaikki suorituskyvyt Advance, koska siellä täällä tallennettu kellojakso todellakin kasvaa, kun on paljon laskelmia suoritettu. Mitä tulee itsemuovautuvaan koodiin, pyysin Lindeniä selittämään sen.
"Ohjelma tulee [tallennustilasta], se siirtää suuren lohkon ohjelmasta sisäiseen RAM-muistiin suoritettavaksi, koska se on nopeampi. Jokainen RAM-käyttö on paljon, paljon hitaampaa, joten teen suuren DMA-lohkon [Direct Memory Access] ROM-muistista RAM-muistiin ja vaihdan sitten varsinaisen ohjelmakoodin. Esimerkiksi ARM pystyy siirtämään operandeja vasemmalle tai oikealle tai se voi peittää tietyt bitit osana käskysarjaa. Ohje määrittää, mitkä bitit aiot peittää tai kuinka monta bittiä aiot siirtyä. Joten luoisin koodin, joka muuttaisi juuri suoritettavaa sen perusteella, kuinka monta bittiä minun piti siirtää. Toinen esimerkki koskee 3D-matriisin kertomista. Siellä on mukana koko joukko kertolaskuja. Luoisin varsinaiset ohjeet, jotka tekevät kertolaskuja sisäiseen RAM-muistiin, ja sitten suorittaisin ne niin, että koodi rakensi osia itsestään, kun se oli käynnissä."
Itsemuovautuvalla koodilla on omat haittapuolensa, erityisesti mitä tulee virheenkorjaukseen. Se poistaa myös haarakäskyjen tarpeen, jolloin koodi hyppää toiseen suoritussekvenssiin ja voi viedä pääsäikeeltä arvokasta laskentaaikaa. Linden kertoi meille myös, että hakutaulukot on kohdistettu täydellisesti ROM-muistiin niin, että ne ovat täydellisesti vasemmalle siirretyn kahdeksan bitin arvon kerrannainen. Hakutaulukon koko on valtava eikä mahdu RAM-muistiin, ja kohdistuksella vältetään myös ylimääräisen latausohjeen tarve taulukon perusosoitteen saamiseksi.
Kaiken kaikkiaan lopullista prototyyppiä kehitettiin lähes kahden vuoden aikana.
Randy Lindenin Quake portin tulevaisuus
Kysyin Lindeniltä, mitä tapahtuisi Quaken sataman tulevaisuudelle, ja hän kertoi minulle, että hän laittoi harkita kysymistä ZeniMaxilta ja id Softwarelta version julkaisemisesta virallisen Quaken kanssa omaisuutta. Hän myös kertoi minulle jossain vaiheessa julkaisevansa lähdekoodin, mutta tällä hetkellä se ei rakenna, koska se vaatii vanhemman tietokoneen.
Kysyin Lindeniltä, miksi hän valitsi Quaken, ja hän kertoi minulle, että hän rakasti peliä ja rakasti haastetta olla "mahdoton projekti", koska se oli hänen DOOM for SNES -porttinsa takana. Hän mainitsi myös, että vaikka hän ei usko, että koko peliä olisi voitu siirtää tilanrajoitusten vuoksi, suurin osa pelistä olisi voinut olla samassa moottorissa.
Jos olet kiinnostunut katsomaan Quake for the Game Boy Advancea, muista katsoa sen julkaisu Forest of Illusionista, jonka voit katsoa alta.
Lataa Forest of Illusionista