İmkansız limanın hikayesi: Quake Game Boy Advance'e nasıl taşındı?

Quake'i Game Boy Advance'e taşımak imkansız görünüyordu ama Randy Linden bunu başarmayı başardı. İşte nasıl.

Game Boy Advance, Nintendo tarafından oluşturulan bir taşınabilir oyun konsoludur. 2001 yılında Japonya'da piyasaya sürüldü ve Game Boy Color'ın halefi olarak hizmet etti. 16,78 MHz'de saat hızına sahip bir ARM7TDMI, 32kb dahili çalışma RAM'i, 256kb harici RAM ve 96kb VRAM'e sahipti. Bu en güçlü makine değil, ancak elde taşınır cihazlar için pek çok kişinin anılarında tuttuğu pek çok oyun var. Cihaz için hiç gün yüzüne çıkmayan oyunlardan biri, id Software tarafından geliştirilen ve bugün bildiğimiz birinci şahıs nişancı türünü tanımlamaya yardımcı olan bir oyun olan Quake'in prototip portuydu.

Quake, muhteşem müzikleri ve bağımlılık yaratan oynanışıyla inanılmaz derecede ayrıntılı bir oyundur ve tıpkı DOOM gibi, aklınıza gelebilecek neredeyse her cihaza taşınmıştır. Game Boy Advance'e olan bağlantı noktası, doğal olarak 3D grafikleri desteklemediği için özellikle inanılmaz ve Nintendo, elde taşınır cihazı özellikle iki boyutlu bir oyun deneyimi olarak pazarladı. Ancak bu Randy Linden'in kendi limanını geliştirmesini engellemedi.

Modern Vintage Gamer'ın izniyle kullanılan Analog Pocket'te oynanan Quake bağlantı noktasının fotoğrafı

Eğer Linden'e aşina değilseniz, kendisi her iki Bleem'in de geliştiricisi olarak tanınır! (bir PlayStation emülatörü) ve DOOM'un SNES bağlantı noktası; bu, id Software'in kurucu ortağı John Romero'nun bir röportajında ​​söylediği bir başarıdır. Shacknews mümkün olduğunu düşünmüyordu. Linden'in geliştirme becerisi, Game Boy Advance'te Quake'i gerçeğe dönüştürebilecek biri varsa, o kişinin muhtemelen kendisi olduğunu kanıtladı.

Bu liman, Linden'in Forest of Illusion projesi aracılığıyla bunu yayınlaması sayesinde gün ışığına çıktı. Forest of Illusion, Nintendo oyunlarının tarihini korumayı amaçlayan bir projedir ve Linden 256 MB'lık bir flash kartta bulduğu Quake portunun kopyasını kendi bilgisayarında dağıtmak için uzandı mülk.

Sorularımızı yanıtlamaya ve bu makalenin teknik doğruluğunu sağlamaya zaman ayırdığı için Randy Linden'e teşekkür ederiz. Biz de teşekkür etmek isteriz Modern Vintage Oyuncu videosundan ihtiyaç duyulan tüm fotoğrafları kullanmamıza izin verdiği için. Bu bağlantı noktasının id Software veya ZeniMax ile resmi bir ilişkisi yoktur ve Linden tarafından solo bir proje olarak geliştirilmiştir.

Quake'in Game Boy Advance bağlantı noktası

Teknik olarak konuşursak, Quake'in Game Boy Advance'deki seviyeye ulaşması bile bir mucize. İyi bir kare hızında çalışır ve orijinal Quake oyununun doğru ışıklandırmasını ve renk paletini korur. Silahlar ve canavarlar dahil her şey 3 boyutludur. Game Boy Advance'deki oyunlar, tipik olarak spritelar aracılığıyla 3D grafikler elde ediyordu, ancak gerçek olan buydu. Diğer 3D oyunların elde taşınır cihazda yaptığı gibi ışın dökümünü kullanmıyor ve hatta amacına ulaşıyor Dinamik bir yanılsama elde etmek için palet değiştirme hilesi yoluyla önceden oluşturulmuş nesneler üzerinde aydınlatma efektleri aydınlatma.

Açık olmak gerekirse, bu bağlantı noktası oyunun tam sürümü değil ve Linden'in, id Software tamamlandıktan sonra piyasaya sürülmek üzere almayı amaçladığı bir prototip. Ancak Game Boy Advance'in popülaritesi azalmaya başladı ve bunun yerine Linden tarafından yazılan özel motor daha sonra tamamen Linden tarafından geliştirilen başka bir oyunun motoru haline geldi: Cyboid. Linden bize "kodun büyük bir kısmının" hala Game Boy Advance sürümündeki orijinal ARM kodu olduğunu söylüyor. Cyboid'i denemek istiyorsanız Google Play Store'da daha eski bir sürüm mevcut ancak resmi APK artık Amazon Uygulama Mağazası çünkü oyunda çok sayıda düşük seviyeli 32 bit kod var.

KiboidGeliştirici: R ve R Dijital, LLC.

Fiyat: Ücretsiz.

3.3.

İndirmek

Linden ayrıca Cyboid'in en eski sürümlerinden biri olan iPod Video'da çalışan kodunun videosunu da bizimle paylaştı. Game Boy Advance'e Quake bağlantı noktası için kullanılan motor kodunun aynısı üzerine inşa edildi.

Quake'in Game Boy Advance portu, Linden'in içermediği gibi oyunun resmi varlıklarının hiçbirini içermiyor Resmi Quake'i içeren E1M1 sürümünün dağıtımı konusunda id Software veya ZeniMax ile iletişime geçtik varlıklar.

Şu anda dağıtılmakta olan oyun aynı zamanda bir hata ayıklama yapısıdır. Açılışta R tuşunu basılı tutmak, oyuncuyu doğrudan oyunun ikinci haritasına götürecektir ve D-pad'i sola doğru basılı tutmak onları üçüncü haritaya getirecektir. Harita değiştirmeye oyuncu öldüğünde de erişilebilir ve canavarlar, oyuncu ilk önce onlara ateş edene kadar oyuncuya saldırmazlar.

Müziğe gelince, demo genel .S3M dosyalarını kullanıyor ve ses mikseri hem stereo müziği hem de ses efektlerini yönetiyor.

Teknik sınırlar

Game Boy Advance söz konusu olduğunda burayı zor bir liman haline getiren bir takım sınırlar vardı. En büyük engellerden bazıları düşük saat hızı, elde taşınan cihazın 3D grafik özelliklerinin eksikliği ve kayan nokta biriminin (FPU) olmamasıydı. Yol boyunca başka pek çok kişi daha vardı, ancak bunlar Linden'in bana sorunlu olarak belirttiği belirli sorunlu noktalardı. Bu konuya girmeden önce Game Boy Advance'in düzenini anlamak önemlidir.

Ekran görüntüsü Modern Vintage Gamer'ın izniyle kullanılmıştır

Game Boy Advance'in üç RAM seti vardır; biri dahili çalışma RAM'i (IWRAM), diğeri harici çalışma RAM'i (EWRAM) ve üçüncüsü video RAM'dir (VRAM). 32kb IWRAM, hızlı yürütme için ARM talimatlarını depolamak için kullanılırken 256kb EWRAM, yalnızca Başparmak talimatlarını ve daha küçük veri parçalarını depolamak için idealdir. Gibi Rodrigo Copetti'nin notları, EWRAM'e erişim IWRAM'den altı kata kadar daha yavaş olabilir. Game Boy Advance'in 32 bitlik bir el bilgisayarı olarak pazarlanmasına rağmen, EWRAM biçimindeki belleğin büyük bir kısmına yalnızca 16 bitlik bir veri yolu üzerinden erişilebilir. IWRAM'a 32 bitlik bir veri yolu üzerinden erişilebilir. Game Boy Advance'deki VRAM 96kb'de geliyor ve öncelikle grafik verilerini depolamak için olsa da CPU'nun bellek haritasında bulunur ve normal bellek depolaması olarak da kullanılabilir.

Başparmak talimatları, 32 bitlik ARM talimatlarının bir alt kümesidir ve 16 bitlik kelimelerle kodlanmış bir dizi talimattır. Çok fazla yer kaplamadan 32 bit talimatların tüm avantajlarına sahiptirler, bu da onları optimize edilmiş geliştirme için verimli kılar. Bu, EWRAM'e erişim daha yavaş olsa da Başparmak talimatlarının verimli olması nedeniyle çoğu zaman depolanan ARM talimatları kadar hızlı olabileceği anlamına gelir IWRAM'de, Başparmak talimatlarının dezavantajı, bazen ARM komutunun Başparmak eşdeğerinin tam olarak bulunmamasıdır. uygulamak. EWRAM, temelde daha sonra rasterleştirme kodu tarafından tarama satırından tarama çizgisine kadar takip edilen çokgen kenarların listesi olan 3 boyutlu matematik dönüştürme mantığının çıktısını depolamak için kullanıldı.

Linden'ın bana söylediği gibi, tüm bağlantı noktasının en karmaşık ve en zor kısmı tarama çizgisi oluşturucuydu. VRAM'e bir dizi piksel çizmek için tasarlanmış, 10.000'den fazla satırdan fazla optimize edilmiş ARM montaj kodundan oluşur. Tarama çizgisi oluşturucusu 32kb IWRAM'in çoğunu kullandı. Kameraya en yakın kenarlar aktif ve işlenmiştir ve bu aslında büyük bir İkili Uzay Bölümleme (BSP) ağacıdır. Yeterli IWRAM olmadığından poligonal dönüşüm çıktısının sonuçlarını kenar tablolarına depolamak için VRAM kullanıldı, ancak Game Boy Advance'deki VRAM hala EWRAM'den daha hızlı. Grafikler de burada saklandı ve görüntülendi.

Mümkün olan en hızlı yürütme süresini elde edebilmek için optimizasyonlara odaklanmak için çok zaman harcadı. Bu yürütme süresini hızlandırmak için yaptığı üç şey şunları içeriyordu:

  • Kodu yürütülmeden önce kendisi değiştirdi, böylece daha az talimat gerekli oldu
  • Karşılıklı, sinüs, kosinüs, teğet vb. gibi şeyler için bir dizi arama tablosu kullanıldı.
  • Kayıtların değerlerini kaydetmeye ve geri yüklemeye gerek kalmadan ek kayıtlara ("değişkenler" gibi) erişim sağlamak için CPU "modunu" değiştirdik.

Ek kayıtlar kazanmak için CPU modlarını değiştirmek, CPU'ya yakın değerlere hızlı erişim sağlayan ve böylece tek bir saat döngüsünde alınabilen inanılmaz derecede akıllı bir manevradır. Linden'ın bana söylediği gibi, Game Boy Advance'in RAM'inde bir değer depolamak yerine, daha uzun süren kayıtlar arasında geçiş yapmak ve bir değeri almak tek saat döngüsünde mümkündü. CPU'nun kendisi 16,78 MHz'lik bir işlemcidir, yani saniyede 16780000 döngüyü tamamlayabilir. Bu çok gibi görünebilir, ancak ekrandaki her pikseli hesaplamanız ve çizmeniz gerektiğinde, bunlar hızla toplanır ve mümkün olduğu kadar çok işlemi tıraşlamak önemli hale gelir.

Yukarıdaki, Game Boy Advance'in içindeki ARM7TDMI yonga setinin genel kayıtlarının listesidir. Tipik olarak, geliştiriciler kayıtlara yalnızca "Sistem ve Kullanıcı" modunda erişir ve bunun dışındaki normal değişkenleri kullanmaya başvururlardı. Ancak yonga setinin yedi modunun tamamında kayıtlardan yararlandı ve bunun en iyi yanı da şu: modlar arasında geçiş yapabilmesi için diğer modların kayıtlarındaki değerleri hâlâ korur. onlara.

Yeterince komik olan Linden, banka değiştirme yönteminin Nanoboy Advance emülatöründe nasıl bir hata ortaya çıkardığını da anlattı. Anlaşıldığı üzere, bu emülatör, kayıtlardan tasarruf etmek ve geçiş yapmak için CPU'nun diğer modlarının kullanılmasını desteklemiyordu ve Quake demosu, bunu gerçekten yapan bilinen ilk oyundu.

Linden, oluşturduğu bazı notların fotoğrafını bizimle paylaştı ve uygun bir FPU yokluğunda kayan nokta hesaplamalarını nasıl optimize ettiğini anlattı.

Yukarıdaki görüntü Linden'in notlarından bizimle paylaştığı görüntüdür ve özellikle ilginç olan "çeşitli ARM döngüsü talimat sayılarıdır". Bir hesaplama için saat döngüsü sayısını azaltabilmek amacıyla hesaplamalar için döngüleri optimize etmenin bir yolunu tasarladı. Bana anlattığına göre, 8 bitlik bir sayı bir saat döngüsünde, 16 bitlik bir sayı iki saat döngüsünde, 32 bitlik bir sayı üç saat döngüsünde ve 64 bitlik bir sayı dört saat döngüsünde çarpılabilir. .

"[ARM işlemcisinde] iki veya üç uygulama aşaması vardı. Örneğin, birinci kaydı kayıt iki ile çarptığımı ve sonucu kayıt üçe koyduğumu varsayalım. Kayıt 2'nin 16 bitlik bir sayı olduğunu bilseydim, kayıt 1'i kayıt 2 ile çarp demek yerine, çevirirdim ve kayıt ikiyi kayıt birle çarpmak derdim çünkü bu bana zaman kazandırırdı döngü."

Bana bunu yapmasının sebebinin Game Boy'un performansının her bir parçasını sızdırmak olduğunu söyledi. İleri, burada ve orada kaydedilen bir saat döngüsü, çok sayıda hesaplama yapılırken gerçekten de bir araya geliyor gerçekleştirildi. Kendi kendini değiştiren koda gelince, Linden'den bunu açıklamasını istedim.

"Program [depolamadan] geliyor, programın büyük bir bloğunu yürütülmek üzere dahili RAM'e aktarıyor çünkü daha hızlı. Her RAM erişimi çok çok daha yavaştır, bu yüzden ROM'dan RAM'e büyük bir bloğun DMA'sını [Doğrudan Bellek Erişimi] yapıyorum ve ardından gerçek program kodunu değiştiriyorum. Örneğin ARM, işlenenleri sola veya sağa kaydırma yeteneğine sahiptir veya talimat setinin bir parçası olarak belirli bitleri maskeleyebilir. Talimat hangi bitleri maskeleyeceğinizi veya kaç biti kaydıracağınızı belirtir. Böylece, kaç biti kaydırmam gerektiğine bağlı olarak yürütülmek üzere olanı değiştirecek kod üretecektim. Başka bir örnek 3 boyutlu matris çarpımı ile ilgilidir. Burada bir sürü çarpma söz konusu. Çarpmaları yapan gerçek talimatları dahili RAM'de oluşturup, kod çalışırken kendi bölümlerini oluşturacak şekilde bunları yürütürdüm."

Kendi kendini değiştiren kodun, özellikle hata ayıklama söz konusu olduğunda, kendi dezavantajları vardır. Kodun başka bir yürütme dizisine atlayabileceği ve ana iş parçacığını değerli hesaplama zamanından mahrum bırakabileceği dallanma talimatlarına olan ihtiyacı da ortadan kaldırır. Linden ayrıca bize arama tablolarının ROM'da mükemmel şekilde hizalandığını ve böylece sola kaydırılmış sekiz bitlik bir değerin mükemmel bir katı olduklarını söyledi. Arama tablosunun boyutu çok büyüktür ve RAM'e sığmaz ve hizalama aynı zamanda tablonun temel adresini almak için ekstra yükleme talimatı ihtiyacını da ortadan kaldırır.

Sonuçta son prototip neredeyse iki yıl içinde geliştirildi.

Randy Linden'ın Quake limanının geleceği

Linden'e Quake limanının geleceğinin ne olacağını sordum ve o da bana ZeniMax ve id Software'e, sürümün resmi Quake ile yayınlanması konusunda soru sormayı değerlendirin varlıklar. Ayrıca bana bir noktada kaynak kodunu yayınlayacağını söyledi, ancak şu anda daha eski bir bilgisayar gerektirdiğinden oluşturulamıyor.

Randy Linden'in Game Boy Advance'i geliştirme için bir bilgisayara bağlama kurulumu.

Linden'a neden Quake'i seçtiğini sordum ve o da bana oyunu sevdiğini ve DOOM for SNES bağlantı noktasının arkasında olduğu için bu "imkansız proje" olmanın getirdiği zorlukları sevdiğini söyledi. Ayrıca alan kısıtlamaları nedeniyle oyunun tamamının taşınabileceğine inanmasa da oyunun büyük çoğunluğunun aynı motorda olabileceğini de belirtti.

Game Boy Advance için Quake'e göz atmak istiyorsanız, aşağıda kontrol edebileceğiniz Forest of Illusion'daki çıkışına göz atmayı unutmayın.


İllüzyon Ormanı'ndan indirin