Game Boy Advance gibi cihazlar kare hızlarına nasıl ulaşıyor?


31

Bir AVR mikroişlemci ve küçük bir OLED ekrana dayanarak kendi avuç içi oyun cihazımı tasarlıyorum.

128x64 piksel monokrom ekranla başladım ve saniyede 60'dan fazla kareyle rahatça çekebiliyordum.

Geçenlerde bir RGB OLED, 128x128 piksel, sadece 4 FPS elde edebileceğimi bulmak için fazla düşünmeden kullanmaya çalıştım. Bazı düşünce ve dikkatlice yeniden yapılanmadan sonra, başka bir şey yapmayı çok fazla umursamıyorsam, bunu ~ 12fps'ye kadar alabilirim!

Sorum şu: GBA (Game Boy Advance) gibi bir cihaz yaklaşık 60 kare / sn kare hızına nasıl ulaştı? Ayrı bir 'grafik işlemcisi' olduğunu düşündüm ancak ekran verilerini buna aktarırken hala darboğaz olacağımı fark ettim.

Ayrıca, bu ekranların çoğunun sahip olma eğiliminde olduğu 8 bitlik bir paralel arayüzü kullanmayı da merak ettim, bu da beni 8 kat hızlandırabilir, modern MCU'ların seri ve bit için olduğu gibi donanımsal paralel arayüzlere sahip olma eğiliminde olmaması dışında Vurmak muhtemelen hız kazancının çoğunu tüketir.

Başka hangi seçenekler var?

Şu anda USART-SPI üzerinden bir SSD1306 OLED kontrol cihazına bağlı bir ATmega1284P kullanıyorum. Bu tek renkli versiyonudur.

Renkli ekran bir SSD1351 idi, orijinal olarak donanım SPI'sına bağlı değildi. Yeterince fark yaratacağına ikna olmadım , genel olarak çok yavaş

Daha hızlı MCU'lar alabileceğimi biliyorum, ancak başka hangi seçenekleri keşfedebileceğimi bilmek istiyorum - GBA işlemcisi 1284'ümden daha yavaş!


6
“Ekran verilerini buna aktarırken hala tıkanıyordum.” DSİ'nin her birinde 1.2Gbit / sn'ye kadar dört şerit vardır. Hesaplamaların kalanını sana bırakıyorum.
Oldfart

1
Herhangi bir video oyun aygıtındaki herhangi bir grafik gibi, grafikleri işleyebilecek bir bellek var. Bu web sitesine göre , grafikler, sesler vb. İçin bir adres yeri var. Talimatlar orada saklanır. Performans süresiyle çakışma yaratacak çok fazla veri olmadığını varsayarak, grafiksel verileri kolayca yüklemek için bu talimatları uygular.
KingDuken

5
denetleyicisiz ekran satın almak ve kendi denetleyicinizi yapmak
old_timer

4
@ immibis: Neredeyse kesinlikle biraz korkunç I2C veya SPI tabanlı denetleyici. Hobi ustaları, ölçek ekonomilerinden dolayı 20 dolarlık bir friggin '400+ dpi iPhone ekranını alabileceğiniz zamanki gibi aşırı yavaş eşyalarla doludur.
R ..

6
@R .. Sadece bu hobi kontrolcülerinin nedeninin neredeyse her işlemciye arabirim yapabilmeleri için bir neden olduğunu belirtmek istiyorum, çünkü işe yaramaz gibi ses çıkarıyorsunuz. Hiç bir şekilde kolayca bir iPhone ekranına bağlanamazsınız. Muhtemelen özel ve belki de özel bir grafik işlemcisine bağlanır.
user253751

Yanıtlar:


64

Diğer cevaplar, sorunuzu soyut bir düzeyde (donanım) oldukça iyi ele alıyor, ancak özellikle de GBA ile ilgili gerçek tecrübeye sahip olmak, daha ayrıntılı bir açıklamanın zamana değeceğini düşündüm.

GBA, grafik işlemcisinin video RAM’i nasıl yorumladığını kontrol etmek için kullanılabilecek birçok çizim modu ve ayarına sahipti, ancak bir şey kaçınılmazdı: kare hızı. Grafik işlemci neredeyse (aşağıda daha fazlası) bir sabit döngüde ekrana çiziyordu. (Sorunuzla ilgili en alakalı bit bu olabilir.)

Her biri arasında kısa bir mola vererek bir seferde bir satır çizerdi. Çerçeve için son çizgiyi çizdikten sonra, kabaca 30 çizgi çekmek için geçen süreye eşit bir mola verecekti. Sonra tekrar başla. Her çizginin zamanlaması ve her çerçevenin zamanlaması önceden belirlenmiş ve taşa ayarlanmıştır. Bir çok açıdan grafik işlemcisi bu sistemin ustasıydı ve oyunlarınızı davranışları etrafında yazmanız gerekiyordu çünkü hazır olsanız da olmasanız da ne yaptığınızı yapmaya devam edecekti.

Kabaca% 75-80 oranında aktif olarak ekrana itiyordu. Aynı şeyi yapsaydınız hangi kare oranlarını elde edebilirsiniz?

Zamanın% 80'i aynı zamanda CPU'nun kullanıcı girdisini işlemesi, oyun durumunu hesaplaması ve VRAM'in şu anda ekrandan çıkmış (ya da en azından mevcut çizgiye dahil edilmemiş) alanlarına sprite / fayans yüklemek zorunda kalmasıydı.

Kareler arasındaki% 20, işlemcinin tüm sonraki kareyi etkileyebilecek olan video ayarlarını veya RAM'i değiştirmek zorunda kalmasıydı.

Her satırın sonunda, grafik işlemcisi CPU'ya bir hat senkronizasyonu kesmesi gönderir. Bu kesme, birkaç sprite veya birkaç arka plan katmanına ayarlarda ince ayar yapmak için kullanılabilir (bu, çizilen her çizgi arasındaki dikdörtgen maskelerden birinin boyutunu ve konumunu değiştirerek, konik bir spot ışığı gibi bir efekt elde etmenizi sağlar. Donanım söz konusu olduğunda, tüm bu bölgeler dikdörtgendir.). Grafik işlemcinin bir sonraki satırı çizmeye başlamadan önce bu güncellemeleri küçük tutması ve bitirmesi için dikkatli olmalısınız, aksi takdirde çirkin sonuçlar alabilirsiniz. Bu kesintileri işlemek için harcanan her zaman CPU'nun işlem süresinin% 80'ini de keser ...

Bu sistemden en iyi şekilde yararlanan oyunlar için, ne CPU ne de grafik işlemcisi gerçek bir mola vermedi; her biri diğerinin şu anda bakmadığı şeyi güncelleyerek döngüde diğerini takip ediyordu.


5
Hoşgeldin ve iyi geçti.
Mindwin

2
Nintendo DS gibi bazı "daha yeni" sistemler, bir sonraki kareyi konfigüre edilebilir bir süre boyunca geciktirmek üzere (genellikle çok oyunculu oyunların senkronize edilmesine yardımcı olmak için) VCOUNT registerı ekleyerek sabit kare sınırlama sınırını aşmıştır.
orman

21

Onları ilk bilgisayarlardan ve neredeyse tüm ev bilgisayarlarından (1) ayıran tüm oyun konsollarının en önemli özelliği donanım spritelarıydı .

Bağlantılı GBA programlama kılavuzu, ana işlemci bakış açısıyla nasıl çalıştıklarını gösterir. Oynatıcıyı, arka planı, düşmanı vb. Temsil eden bitmap'ler bir bellek alanına yüklenir. Başka bir hafıza alanı, spriteların yerini belirler. Bu nedenle, çok sayıda talimat alan her karede tüm video RAM'leri yeniden yazmak yerine, işlemcinin sadece spriteların konumunu güncellemesi gerekiyor.

Video işlemcisi bu noktada hangi hareketli grafiğin çizileceğini belirlemek için piksel piksel çalışabilir.

Ancak, bu ikisi arasında paylaşılan çift bağlantı noktalı RAM gerektirir ve sanırım GBA'da video işlemcisi ana ARM ve ikincil Z80 işlemcisiyle aynı yonga üzerinde.

(1) Önemli istisna: Amiga


Sadece bir nit - gerçekten erken arcade oyunlarında, çift işlemcili bir RAM değil, grafik işlemcisi ile ilişkili bir ROM'da sprite vardı. Aynı şekilde erken konsollarda da böyle olup olmadığına dair hiçbir fikrim yok, ancak kesinlikle bu şekilde yapılabilirdi.
TimWescott

@TimWescott GBA'nın çoklu çizim modları vardı ve çoğu ile deneyime sahip değilim, bu yüzden bu evrensel olarak doğru olmayabilir, ancak bu modlardan hiçbirinin ROM'lara doğrudan erişimi olduğunu sanmıyorum (genellikle): Döşeme / sprite / palette verilerinin ROM'dan video belleğine aktarılması ve grafik işlemcisinin oradan üzerinde çalışılması gerekiyordu.
Mr.Mindor

@ Mr.Mindor Açık olmasam özür dilerim - GB veya GBA'nın nasıl yaptığı hakkında bilgi sahibi gibi davranmıyorum. Sadece hepimizin h *** onlar merak vardı, geri geç 70 ve erken 80 en gerçekten erken Nintendo oyun salonu yorumlarken geldi mi o.
TimWescott,

@TimWescott: Bence aynısı NES için de geçerliydi, ancak söz konusu ROM Oyun Pakları içinde yer almıştı.
supercat,

19

“Sorum şu: GBA gibi bir cihaz yaklaşık olarak 60 fps kare hızına nasıl ulaştı?”

Sadece soruyu cevaplamak için, bir grafik işlemcisi ile yaptılar. Game Boy'un sprite grafikleri kullandığından eminim. En üst seviyede, grafik işlemcisinin arka plan görüntüsü, Mario görüntüsü ve Prenses Şeftali görüntüsü vb. Gibi şeyleri yüklediği anlamına gelir. x ve y'de, Mario x # 3'ü bu x, y konumunda "vb. üst üste bindirin. Böylece, ana işlemci her bir pikselin çizilmesi ile kesinlikle olumlu bir şekilde ilgilenmez ve grafik işlemcisi, kesinlikle durumun hesaplanması ile ilgilenmez oyun. Her biri, yapması gereken şey için optimize edilmiştir ve sonuç, çok fazla hesaplama gücü kullanmadan oldukça iyi bir video oyunudur.


7
"Grafik işlemci" olarak adlandırmak, ne tür bir işlemci olduğunu öne sürerek, yaptıklarını abartıyor. Bu sadece bir video denetleyici, temelde karmaşık bir sıralayıcı. Yatay ve dikey pikselleri sayarken, başlık ve / veya sprite verilerini alır, bunları kayma kayıtlarına koyar ve kayma kayıtlarının çıktısını çıktı pikseline birleştirir. Gerçek bir "GPU" grafik işlemcisi gibi bir programı çalıştıramaz.
Ross Ridge

14

GBA oldukça yavaş bir işlemciye sahipti. ARM7 çok hoş; Onlar sadece yavaş koştu ve hiçbir kaynak yanında verdi.

Bu noktada ve daha önce pek çok Nintendo oyununun yan kaydırma oynamasının bir nedeni var. DONANIM. Hepsi donanımda yapılır. Birden fazla kiremit katmanının yanı sıra bir veya daha fazla sprite da vardı ve donanım bu tablolardan piksel çıkarmak ve ekranı sürmek için tüm çalışmaları yaptı.

Ön kurulum setini kurdunuz ve ardından bir harita haritası olan ufacık bir hafızaya sahiptiniz. Sol alt döşemenin 7 döşemesi olmasını ister misiniz? Hafızaya 7 yazdın. Bir sonraki kutucuğun kiremit 19 olmasını ister misin? Döşeme kümesinde, oraya bir 19 koydunuz ve etkinleştirdiğiniz her katman için böyle. Sprite için sadece x / y adresini ayarlayın. Ayrıca, bazı kayıtları ayarlayarak ölçeklendirme ve döndürme işlemi de yapabilirsiniz; donanım gerisini halleder.

Doğru hatırlıyorsam Mod 7, bir piksel moduydu, ancak bu, piksel kaplaması için bayt koyduğunuz geleneksel bir ekran kartı gibiydi ve donanım video yenilemeyle ilgileniyor. Masa tenisine ya da en azından yeni bir kareye sahipken onları çevirebildiğinizi düşünüyorum, ama doğru hatırlamıyorum. Yine, işlemci o gün ve yaş için oldukça düşük seviyedeydi ve çok fazla hızlı kaynağa sahip değildi. Bu yüzden bazı oyunlar 7. moddayken, çoğu kiremit bazlı kaydırıcılardı ...

Yüksek kare hızına sahip bir çözüm istiyorsanız, bu çözümü tasarlamanız gerekir. SPI veya I²C veya bunun gibi bir şeyle bulduğunuz ve konuştuğunuz eski bir ekranı açamazsınız. Önüne en az bir kare tamponu yerleştirin, ideal olarak iki tane ve eğer mümkünse bu ekran üzerinde satır ve sütun kontrolü yapın.

Satın aldığınızdan şüphelendiğim ekranların bir kısmında, üzerinde konuştuğunuz bir denetleyici var. GBA / konsol tipi performans istiyorsanız, denetleyiciyi yaratır / uygularsınız. Ya da bir GPU / video yongası / mantık blobuyla satın alıyor / oluşturuyorsunuz ve HDMI veya diğer ortak arayüzü bir stok monitörde kullanıyorsunuz.

Bir bisikletin lastikleri, bir zinciri ve dişlileri olması, bir motosiklet kadar hızlı gidebileceği anlamına gelmez. Sistemi, performans ihtiyaçlarınızı karşılamak için baştan sona tasarlamanız gerekir. Bu bisiklet tekerleğini o motosikletin üzerine koyabilirsiniz, ancak istenildiği gibi performans göstermez; bileşenlerin tümü genel tasarımın bir parçası olmak zorunda.

Asteroitler de bu şekilde çalıştı; sadece bir 6502'ye ihtiyaç duyuyordu. Vektör grafikleri ayrı bir mantıkla yapıldı; 6502 vektör grafik denetleyicisine küçük bir veri dizisi gönderdi, bu da bir ROM ve kiriş ve z'nin xy grafiğini yapmak için bu verileri kullandı, açık / kapalı ... Bazı standup'larda ses ve videoyu ayırmak için ayrı işlemciler vardı. oyunu hesaplayan işlemci. Tabii ki bugün, video, ana işlemciden ayrı olmayan binlerce işlemci olmasa da, yüzlerce kişi tarafından kullanılıyor ...


Yemin ederim, mod7'nin Sega'nın "hiper modu" ya da bir şey ... belki de "Süper FX?" E bir cevap olarak pazarlama yoluyla ayakkabının alındığını hatırlıyorum. tr.wikipedia.org/wiki/Mode_7
Caleb Jay

coranac.com/tonc/text/bitmaps.htm#sec-modes Yanlış olduğunu hatırlıyor olabilirim belki 5 modunu veya bitmap modlarından birini düşünüyorum, sprite ve bitmap / framebuffer modlu veya modlu bazı fayans modları var. . belki bir 7 vardır. Bağlantılı olan hakkında bir şey bilmiyordum ama bunu bilmek güzel.
old_timer

hmm mod 7 hakkında daha fazla okuma ve sadece bir mod değil. Her neyse, GBA, döşeme haritasına ve bitmap modlarına sahiptir, çünkü döşeme haritasındaki bir baytın birçok piksel ürettiği her pikselden sizin sorumlu olmanız gerekir. Ayrıca, otobüslerin boyutlarını (genişliğini) ve belleğin hızını ve bazı şeyleri (yönergeleri) romdan biraz daha hızlı bir şekilde almak için bir rom boru hattı önbellek şeyinden yararlandılar. Ancak ilk günden itibaren, iyi bir hızda çalışacak bir yazılım elde etmek için uğraşıyordunuz ve neyse ki mantık video çalışmalarının çoğunu halletmişti.
old_timer

Bu paralel 8 bit ya da 4 bit ya da performans için istekli olan arabirim veya spi ya da i2c arayüzleri olan satın aldığınız ekranlara bakarsanız, ham ekranın bu kontrolörler olmadan olmasını ve ardından ekranın nasıl yönetildiğini kontrol edebilirsiniz. , bir framebuffer oluşturun ya da iki cpu ping / pong ve cpu işlemciler için hızlı bir arayüz ping yapabilirsiniz. İlk etapta yeterince hızlı bir ekran ile başladığınızı varsayalım.
old_timer

7

GBA gibi bir cihaz yaklaşık 60 fps kare hızına nasıl ulaştı?

Donanım.

Program veri / veri belleği ile aynı veri yolunu paylaşan veya paylaşmayacak grafik belleği var ... ama asıl önemli olan şey, belleği saniyede 60 kez okuyan ve veriyi LCD’ye kullanarak LCD’ye gönderen bir grafik işlemcisine sahip olmasıdır. verimli bir şekilde yapmak için tasarlanmış optimize edilmiş bir arayüz.

Aynısını "LCD arabirim" çevre birimlerine sahip herhangi bir modern mikrokontrolcüyle yapabilirsiniz, örneğin LPC4330. Elbette uyumlu bir LCD panele ihtiyacınız olacak.

Modern hızlı mikrodenetleyiciler (yani ARM AVR değil) ve bu kadar küçük bir ekranla, grafik işlemlerini hızlandırmak için büyük olasılıkla sprite veya blitter kullanmak zorunda kalmayacaksınız. 8 bitlik bir AVR ile yavaş olabilir.

Ancak cpu ne olursa olsun, arayüzü ekrana vurarak bit emmek olacak.

Atari 2600'ün resmi televizyona göndermek için CPU'yu kullandığını düşünüyorum. Bu biraz modası geçmiş.


2600 bile donanım sprite sahip, çok sınırlı sayıda olmasına rağmen (iki oyuncu ve iki mermi sanırım)
pjc50

2
@ pjc50, Atari 2600 türünde donanım spriteları vardı. Grafik alt sisteminin diğer tüm kısımları gibi tek boyutlu nesnelerdi. Programcı bir dizi dikey çizgi dışında bir şey isterse, her satır ekrana çekildikten sonra programın sprite güncellemesi gerekir.
Mark

1
@Mark: 2600 kesinlikle donanım sprite sahipti. Donanım yalnızca yatay konumlandırmayı kontrol ediyordu, ancak 2600'deki spritelar, oyunların rakiplerinden çok daha renkli oyun üretmesini mümkün kıldı.
supercat,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.