古いゲームのデータ構造


10

NESのスーパーマリオブラザーズやSNESのスーパーマリオワールドのような古いゲームをプログラミングするときに使用されるデータ構造に興味があります。私の理解は、この時代のゲームは組み立てで書かれたということです。プログラマーはデータ構造を定義/使用しましたか?

例:コインのグループが画面に表示されたら、どのように保存されますか?プログラマーは配列だけを使用しましたか?または、おそらくリンクリストがありましたか?

乾杯!

編集:私はさまざまなアプローチに興味があります...普遍的なアプローチである必要はありません。

編集2:私のゲームのいくつかでは、コレクションに対して(潜在的に悪い)アプローチを使用しており、古いゲームのいずれかが同様のアプローチを使用したかどうかを知りたいです。私は次のことをしたいです:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
普遍的な答えはありません。それは、特定のプログラマーが特定の問題のソリューションをどのように実装したかにかかっています。
Ed S.

1
これらのゲームのすべてがアセンブリで記述されているとは思いませんが、アセンブリプログラマがプログラムからプログラムへのコピー/貼り付けの再利用のために小さなコンポーネントを収集することはかなり一般的であったと言います。結局何回printf()関数を書きたいですか?:)
James

いい視点ね。動的に割り当てられたコレクションと静的に割り当てられたコレクションの
違い

1
特定の問題はありますか?なぜあなたは古いゲームが何をするのか気にしていますか?
テトラッド、2011

2
2番目の編集で得られるのは、「配列の構造」レイアウトの例です。これは、並列処理とSIMD操作に利点があるため、現代のゲームでも一般的です。:ソニーは、構造化データの伝統的なC ++の方法は、コストPERF隠された深刻なことができますどのように数年前にプレゼンテーションを行いましたresearch.scee.net/files/presentations/gcapaustralia09/...
Crashworks

回答:


13

16ビットの時代でさえ、ゲームコンソールは基本的にはリアルタイムソフトウェアを実行する小型の組み込みコンピューターであり、私たちが使用したデータ構造は、コンピューターサイエンスのどこにでも見られるものと同じです:配列、行列、ヒープ、ツリー。リンクリストは非常に遅いため、リンクリストはそれほど多くありません(間接参照には長い待ち時間があります)。

違いは、STLの前であり、パフォーマンスが非常に重要であるため、通常は自分で構造とアルゴリズムを記述する必要がありました。

デビッドブラベンは、2011年のGDCで楽しい講義を行い、1984年にエリートBBCマイクロに適合させるために使用したすべてのクレイジーなトリックについて話しました。GDCのVaultで無料で見ることができます。


涼しい。動的に割り当てられた配列を使用しましたか?または、ほとんどが静的なサイズでしたか?たとえば、5つのコインが画面に表示され、プレーヤーがそれらを収集する(または画面外にスクロールする)まで画面に表示されたままになる状況に興味があります。
MrDatabase

2
@MrDatabase-可能な限り静的割り当て。あなたが説明するような場合のために、私たちはしばしば、例えば存在する可能性のある32の可能なコインの静的に割り当てられた配列を持っています。コインが世界に入ってきたら、配列のスポットを埋めます。彼らが去ったとき、私たちはそれを空白にします。ダイナミックアロケーションは利用できませんでした。RAMが2 MBしかない場合は、プログラムが一定のメモリで実行されることを保証する必要があるため、使用を避けました。
Crashworks、2011

涼しい。私は似たようなことをします(質問の編集#2を参照)。私の更新関数では、maxNumCoins if(coinsActive)をループして更新する前に、「coinsActive」ビットセットを確認します。このようにして、ゼロコインがアクティブな場合にループを完全に回避します。
MrDatabase

GDCボールトリンクにより+1。Peter Molyneuxによる死後のPopolousの話は、私が今まで見た中で最も陽気な話であるに違いありません。
TravisG 2011

MeDataBase-最後にアクティブになったオブジェクトを、非アクティブになったコインで占められていたスロットにコピーします(つまり、10枚のコインがある場合、コイン5が非アクティブになり、コイン10をスロット5にコピーして、numactiveコインを減らします)。 numCoinsに追加し、それらすべての要素を更新します。'if'は必要ありません。もちろん、これは、非アクティブなコインが状態を維持する必要がない場合、および更新の順序が重要ではない場合にのみ機能します(配列が実際のコインではなくコインへのポインターを格納する場合、状態は維持できますが、キャッシュの分散動作が発生します) 'if'よりもおそらく悪い)
Kaj

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.