Game Boy Advanceのようなデバイスはどのようにフレームレートを達成しますか?


31

私は、AVRマイクロコントローラーと小さなOLEDディスプレイをベースにした独自のハンドヘルドゲームデバイスを設計しています。

128x64ピクセルのモノクロディスプレイから始めて、毎秒60フレーム以上で快適に描画できます。

最近、私はそれを作り直して、RGB OLED、128x128ピクセルを使用しました。実際に考えすぎずに、約4 FPSしか達成できなかったことがわかりました。少し考えて慎重にリファクタリングした後、他に何もしなくても大丈夫なら最大12fpsになります!

私の質問は-GBA(Game Boy Advance)のようなデバイスはどのようにしてほぼ60fpsのフレームレートを達成したのですか?別の「グラフィックスプロセッサ」を使用することを考えましたが、それでも表示データを転送するのがボトルネックになることに気付きました。

また、これらの画面のほとんどが持つ傾向のある8ビットパラレルインターフェイスを使用することについて疑問に思いました。これは、シリアルとビットのようにハードウェアパラレルインターフェイスを持たない現代のMCUを除き、8倍のスピードアップにつながる可能性があります叩くと、速度が大幅に向上します。

他にどのようなオプションがありますか?

現在、USART-SPIを介してSSD1306 OLEDコントローラーに接続されているATmega1284Pを使用しています。それがモノクロ版です。

カラー画面はSSD1351で、元々ハードウェアSPIに接続されていませんでした。私はそれが十分な違いを生むと確信していませんでした、全体的に遅すぎるだけです

より高速なMCUを入手できることは知っていますが、他にどのようなオプションを検討できるかを知りたいと思います-GBAプロセッサは私の1284よりもかなり遅いです!


6
「表示データをそこに転送することはまだボトルネックになります。」DSIには、それぞれ最大1.2ギガビット/秒の4つのレーンがあります。残りの計算はあなたに任せます。
オールドファート

1
ビデオゲームデバイスのグラフィックスと同様に、グラフィックスを処理するメモリがあります。このウェブサイトによると、グラフィックス、サウンドなどのアドレスの場所があります。指示はそこに保存されます。パフォーマンス時間との競合を引き起こすデータが多くないと仮定すると、それらの命令を実行してグラフィカルデータを簡単にロードします。
KingDuken

5
コントローラーのないディスプレイを購入し、独自のコントローラーを作成します
old_timer

4
@immibis:ほぼ間違いなく、I2CまたはSPIベースのひどいコントローラーです。趣味のようなものは、規模の経済のために20ドルで冷静な400+ dpiのiPhoneスクリーンを手に入れることができるような、高値の遅いものでいっぱいです。
R ..

6
@R ..これらの趣味のコントローラーの理由は、ほとんどすべてのプロセッサーに接続できるからです。iPhoneの画面に簡単に接続することはできません。おそらく専用のカスタムグラフィックプロセッサに接続します。
user253751

回答:


64

他の回答は、抽象的なレベル(ハードウェア)であなたの質問をかなりよくカバーしますが、特にGBAの実際の経験があると、より詳細な説明が価値があると思いました。

GBAには、グラフィックプロセッサがビデオRAMを解釈する方法を制御するために使用できる多くの描画モードと設定がありましたが、1つのことは避けられませんでした。フレームレートです。グラフィックプロセッサは、ほぼ一定のループで画面に描画していました。(これはおそらくあなたの質問に最も関連するビットです。)

それぞれの間に非常に短い休憩をとって、一度に1本の線を引きます。フレームの最後の線を描いた後、30本の線を描くのにかかる時間とほぼ等しい休憩が必要です。その後、もう一度開始します。各行のタイミング、および各フレームのタイミングはすべて事前に決定されており、明確に設定されています。多くの点で、グラフィックプロセッサは実際にそのシステムのマスターであり、準備ができているかどうかに関係なくゲームの動作を続けるため、ゲームの動作を記述する必要がありました。

画面に積極的にプッシュしていた時間のおよそ75〜80%。同じことをしている場合、どのフレームレートを達成できますか?

その80%の時間は、CPUがユーザー入力を処理し、ゲームの状態を計算し、スプライト/タイルを現在画面の外にある(または少なくとも描画されている現在の行に含まれない)VRAMの領域にロードするために必要なものでもありました。

フレーム間の20%は、すべてのCPUが次のフレーム全体に影響を与えるビデオ設定またはRAMを調整するために必要でした。

各ラインの終わりで、グラフィックプロセッサはライン同期割り込みをCPUに送信します。この割り込みは、いくつかのスプライトまたはいくつかの背景レイヤーの設定を調整するために使用できます(これにより、描画される各線の間の長方形マスクのサイズと位置を変更することにより、円錐スポットライトのような効果を得ることができます。ハードウェアに関する限り、これらの領域はすべて長方形です。)グラフィックプロセッサが次の行の描画を開始する前に、これらの更新を小さくして終了するように注意する必要があります。そうしないと、youい結果が得られます。これらの割り込みの処理に費やした時間も、CPUの処理時間の80%に削減されます...

このシステムを最大限に活用したゲームの場合、CPUもグラフィックプロセッサも実際に休憩することはありませんでした。それぞれは、ループの周りでお互いを追いかけ、他の人が現在見ていないものを更新していました。


5
おかえりなさい。
マインドウィン

2
ニンテンドーDSのような一部の「新しい」システムは、VCOUNTレジスタを追加して設定可能な時間だけ次のフレームを遅延させることにより、固定フレームレート制限を回避しました(通常、マルチプレイヤーゲームの同期を支援するため)。
フォレスト

21

初期のPCや事実上すべての家庭用コンピューターと区別できるすべてのゲームコンソールの重要な機能は、ハードウェアスプライトでした。

リンクされたGBAプログラミングガイドは、メインプロセッサの観点からどのように機能するかを示しています。プレーヤー、背景、敵などを表すビットマップは、メモリの1つの領域にロードされます。メモリの別の領域は、スプライトの場所を指定します。そのため、多くの命令を必要とするすべてのビデオRAMをフレームごとに書き換える代わりに、プロセッサはスプライトの場所を更新するだけです。

ビデオプロセッサはピクセルごとに動作して、その時点でどのスプライトを描画するかを決定できます。

ただし、これには2つの間で共有されるデュアルポートRAMが必要です。GBAでは、ビデオプロセッサはメインARMおよびセカンダリZ80プロセッサと同じチップ上にあると思います。

(1)重要な例外:Amiga


ほんの少し-本当に初期のアーケードゲームでは、デュアルポートRAMではなく、グラフィックプロセッサに関連付けられたROMにスプライトがありました。それが初期のコンソールの場合にも当てはまるかどうかはわかりませんが、確かにそのようにすることができました。
ティムウェスコット

@TimWescott GBAには複数の描画モードがあり、私はほとんどの経験がありませんので、これは普遍的に真実ではないかもしれませんが、これらのモードのいずれもROM(カートリッジ上の)に直接アクセスできるとは思いません:タイル/スプライト/パレットデータをROMからビデオメモリに転送する必要があり、グラフィックプロセッサがそこから作業を行いました。
Mr.Mindor

@ Mr.Mindorわからない場合は申し訳ありません-GBまたはGBAがそれをどのように行ったかについての知識を装ってはいません。私は70年代後半から80年代前半の任天堂のアーケードゲームについてコメントしていました。
ティムウェスコット

@TimWescott:同じことがNESにも当てはまったと思いますが、問題のROMはGame Paks内にありました。
supercat

19

「私の質問は、GBAのようなデバイスが60fps近くのフレームレートをどのように達成したかです。」

質問に答えるために、彼らはグラフィックプロセッサでそれをしました。Game Boyはスプライトグラフィックスを使用していると確信しています。トップレベルでは、グラフィックプロセッサは、背景の画像、マリオの画像、ピーチ姫の画像などをロードします。メインプロセッサは、「これにより背景オフセットを表示する」などのコマンドを発行します。 xとyに多く、このx、y位置にマリオ画像#3をオーバーレイします」などです。したがって、メインプロセッサは各ピクセルの描画にまったく積極的に関与しておらず、グラフィックプロセッサはゲーム。それぞれが必要な処理に合わせて最適化されており、その結果、多くの計算能力を使用せずに非常に優れたビデオゲームが作成されます。


7
「グラフィックプロセッサ」と呼ぶと、機能が誇張され、独自のCPUの一種であることが示唆されます。それはビデオコントローラーに過ぎず、基本的には複雑な種類のシーケンサーです。水平および垂直ピクセルをカウントアップすると、タイトルおよび/またはスプライトデータを取得し、シフトレジスタに入れ、シフトレジスタの出力を出力ピクセルに結合します。実際の「GPU」グラフィックプロセッサのようなプログラムを実行することはできません。
ロス・リッジ

14

GBAのプロセッサはかなり低速でした。ARM7は非常に優れています。彼らはただそれをゆっくりと走らせ、資源をほとんど与えなかった。

その時点および以前の任天堂のゲームの多くが横スクロールであった理由があります。ハードウェア。すべてハードウェアで行われます。複数のタイルレイヤーと1つ以上のスプライトがあり、ハードウェアがすべての作業を行って、それらのテーブルからピクセルを抽出し、ディスプレイを駆動しました。

あなたは前もってセットアップされたタイルを構築し、それからタイルマップであった小さなメモリを持っていました。左下のタイルをタイル7にしたいですか?そのメモリの場所に7を置きます。次のタイルをタイル19にしたいですか?タイルセットで、そこに19を配置します。これを、有効にした各レイヤーに対して行います。スプライトの場合、x / yアドレスを設定するだけです。また、いくつかのレジスタを設定することでスケーリングと回転を行うことができ、残りはハードウェアが処理します。

モード7は、覚えているならピクセルモードでしたが、ピクセルの色をカバーするバイトを入れる従来のビデオカードのようで、ハードウェアがビデオの更新を処理します。ピンポンはできると思うし、少なくとも新しいフレームができたらフリップすることもできると思うが、正しく覚えていない。繰り返しになりますが、プロセッサはその日と年齢に対してかなりアンダークロックされており、高速リソースがあまりありませんでした。そのため、一部のゲームはモード7でしたが、多くはタイルベースのサイドスクローラーです...

高フレームレートのソリューションが必要な場合は、そのソリューションを設計する必要があります。見つけた古いディスプレイをそのまま使用して、SPIやI²Cなどで話をすることはできません。その前に少なくとも1つ、理想的には2つのフレームバッファを配置し、可能であればそのディスプレイ上で行と列を制御します。

あなたが購入していると思われるディスプレイの多くには、実際に話しているコントローラーが搭載されています。GBA /コンソールタイプのパフォーマンスが必要な場合は、コントローラーを作成/実装します。または、GPU /ビデオチップ/ロジックBLOBで購入/構築し、HDMIまたはその他の一般的なインターフェイスを使用してストックモニターに組み込みます。

自転車にタイヤとチェーンとギアが付いているからといって、バイクほど速く走れるわけではありません。パフォーマンスニーズに合わせてエンドツーエンドでシステムを設計する必要があります。その自転車の車輪をそのオートバイに置くことはできますが、期待通りに機能しません。すべてのコンポーネントは、全体的な設計の一部である必要があります。

小惑星もこのように働きました。1つの6502だけが必要でした。ベクトルグラフィックスは個別のロジックで行われました。6502は、データの小さな文字列をベクターグラフィックスコントローラーに送信しました。ROMとそのデータを使用して、ビームとzのxyプロットをオン/オフしました。一部のスタンドアップには、プロセッサがゲームを計算します。もちろん今日では、ビデオはメインプロセッサとは別の数千ではないにしても、数百のプロセッサで処理されています...


mode7は、セガの「ハイパーモード」または何か...多分「スーパーFX?」への応答として、マーケティングによって圧倒されることを覚えています。en.wikipedia.org/wiki/Mode_7
カレブジェイ

coranac.com/tonc/text/bitmaps.htm#sec-modes モード5、またはビットマップモードのいずれかを考えていると思いますが、スプライトとビットマップ/フレームバッファモードのあるタイルモードがあります。 。リンクしているものについて知らなかったかもしれませんが、知っておくと良いでしょう。
old_timer

うーん、モード7だけでなく、モード7についても読んでいます。とにかく、GBAにはタイルモードとビットマップモードがあり、タイルマップ内の1バイトのタイルモードが多くのピクセルを生成するすべてのピクセルを処理する必要があるため、速度が遅くなります。また、バスのサイズ(幅)とメモリの速度、およびROMパイプラインキャッシュを活用して、ROMからデータ(命令)を少し速く取り出すのを支援しました。しかし、最初からソフトウェアをまともな速度で実行するのに苦労していました。ありがたいことに、ロジックがほとんどのビデオ作業を処理してくれました。
old_timer

これらのパラレル8ビットまたは4ビット、またはspiまたはi2cインターフェイスを搭載しているこれらのディスプレイを購入して、パフォーマンスを損なっているディスプレイを見る場合、これらのコントローラーなしの未加工ディスプレイが必要であり、ディスプレイの管理方法を制御できます、フレームバッファを1つまたは2つ作成して、CPUからフレームバッファへのping / pongおよび高速インターフェイスを可能にします。そもそも十分な速さのディスプレイから始めることを前提としています。
old_timer

7

GBAのようなデバイスはどのようにして60fps近くのフレームレートを達成しましたか?

ハードウェア。

グラフィックメモリがあり、プログラム/データメモリと同じバスを共有する場合と共有しない場合がありますが、重要な点は、メモリを1秒間に60回読み取り、データをLCDに送信するグラフィックプロセッサがあることですこれを効率的に行うために設計された最適化されたインターフェイス。

LPC4330など、「LCDインターフェース」周辺機器を備えた最新のマイクロコントローラーでも同じことができますが、これはかなりやり過ぎかもしれません。もちろん、互換性のあるLCDパネルが必要になります。

最新の高速マイクロコントローラー(つまり、AVRではなくARM)とこのような小さな画面では、グラフィックス操作を高速化するためにスプライトやブリターはおそらく必要ないでしょう。8ビットAVRでは、速度が遅くなる場合があります。

しかし、CPUに関係なく、ディスプレイへのインターフェイスを少し強打するのは面倒です。

Atari 2600はCPUビットバンギングを使用して画像をテレビに送信したと思います。それは少し時代遅れです。


でも、2600年は非常に限られた数(2人の選手と私は考える2弾)が、ハードウェアスプライトを持っていた
pjc50

2
@ pjc50、Atari 2600 はハードウェアスプライトがありました。グラフィックスサブシステムの他のすべての部分と同様に、それらは1次元のオブジェクトでした。プログラマが垂直線のセット以外のものを必要とする場合、プログラムは各行が画面に描画された後にスプライトを更新する必要がありました。
マーク

1
@Mark:2600にはハードウェアスプライトがありました。ハードウェアは水平方向の位置決めのみを制御しましたが、2600のスプライトにより、ゲームは競合他社よりもはるかにカラフルなゲームを作成できました。
supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.