ビデオゲームはどのようにして情報を画面外に保存しますか?


16

私は最初からビデオゲームを作ろうとしていますが、これは本当に新しく、基本的な問題に直面し続けています。最も重要なのは、ビデオゲームがオフスクリーン情報をどのように保存するかということです。つまり、プログラムは画面に次に表示するものをどのように知るのでしょうか?または、プレーヤーが環境を変更した場合、次に画面にロードするときにこの変更はどのように残りますか?

たとえば、New Super Mario Brosで?を押すと、ブロックしてから画面の外に出て、戻ってきても、ヒットしたままです。この情報はどのように保持され、次にプレーヤーがブロックをロードするときに実行されますか?なぜリセットされないのですか?


24
ペダントリー:スーパーマリオブラザーズで、ヒットした場合は?ブロックしてから画面外に戻ると、戻ることができません。ゲームは一方向にしかスクロールせず、すべてのワープパイプは一方向です。
トレバーパウエル

61
テキストドキュメントを読んで下にスクロールすると、ワードプロセッサはドキュメントの先頭を削除しますか?
フィリップ

31
モニターには、ゲームワールドへのウィンドウが表示されます。世界はあなたの窓の外に存在します-あなたはそれを見ません。
フェルシル

11
より一般的な初心者プログラミングの質問は、「画面に情報を表示するにはどうすればよいですか?」です。プログラミングチュートリアルを実行すると、その質問にたどり着いた時点で、すでに質問に対する答えが得られているはずです。
ピーター-アンバンロバートハーヴェイ

4
私はあなたがその保管の事で作業している種類の開発環境のだろうかオフより多くのそれらを得るよりも、複雑な画面の音画面:)それともこれだけで純粋に理論的な質問がありますか?
ルアーン16

回答:


59

通常、ゲーム環境の論理状態を視覚的表現から分離する必要があります。

プレイヤーは画面の一部しか表示しないかもしれませんが、レベル全体の状態をメモリに保持し、通常はレベル全体のゲームの仕組みも計算します。あなたの世界が非常に大きいため、これが多すぎるRAMやCPUを必要とする場合は、ハードドライブにさらに離れた領域を一時停止することができます。

レンダリングサブルーチンは、レベルのどの部分が現在画面上にあるかを確認し、それらの部分のみを描画します。画面外にあるものは描画されませんが、それが更新されないという意味ではありません。


37

あなたはそれを逆行します。

ゲームの論理的な状態から始めて、それをモデル化します。全世界の論理状態全体は、ほぼ確実に一度にメモリに保持するには多すぎるため、独立してロードおよび保存できる小さな部分に分解します。これらの部分はしばしばと呼ばれます。これらのチャンクは連続した世界を形成できますが、別々のレベル/インスタンスにすることもできます。用語は、ジャンルと使用するテクニックによって大きく異なります。

次に、興味のある部分、つまりプレーヤーの近くにあるチャンクをロードします。遠すぎるチャンクはディスク/永続ストレージに保存され、メモリからアンロードされます。

そして最後のステップとして、実際に見えるものを決定し、現在のゲームの状態の視覚的表現を作成し、それを画面にレンダリングします。

もちろん、ビジュアルリプレゼンテーション全体を毎回再構築するのではなく、既に構築されているパーツがある場合はキャッシュして再利用しようとしますが、それが主な原則です。


これは、出力を含むすべてのプログラムに当てはまります。テキストエディタのような通常のGUIを使用してプログラムを作成する場合、ドキュメントをモデル化し、GUIがドキュメントの状態と表示部分を決定し、画面にレンダリングします。または、フォームフィールドを適切に入力するか、そうでない場合。

主な要点は次のとおりです。最初にデータをどこにどのように保存するかを考えます(おそらくそれを表現する方法と一緒に)。ほとんどすべてのプログラムがデータストレージを処理する必要があります。データを保存しないケースはほとんどありません。


7
チャンク?それらの小さなピースをレベルと呼びます
gbjbaanb 16

3
これは、「独立してロードおよび保存できる小さなパーツに分割するので、これらのパーツはしばしばチャンクと呼ばれる」ことを除き、非常に大きな世界を持つゲームに固有のようです。多くのゲームはそのようなことをする必要はありません。これまでに作成されたすべての2Dサイドスクローラーのすべてのレベルデータをメモリに収めることができたとしても、驚くことではありません。
user253751 16

3
@gbjbaanb「レベル」は時代遅れの用語であり、「チャンク」ははるかに包括的で明確に区別された概念です。すべてのチャンクがレベルであるわけではなく、すべてのレベルがチャンクであるわけでもありません。
リリエンタール

3
それについて考えるのに役立つ方法は、1つのピクセルをレンダリングせずにゲーム全体をプレイすることが技術的に可能でなければならないこと、つまり、ゲーム全体が視覚的表現から分離されていることです。
ネイサンK

1
@Lilienthalは確かですが、レベルはまだ一般的な使用法であり、多くのゲームにはまだコンセプトがあると思います-新しい「アリーナ」を取得してプレイヤーがそれらをトラバースするときに「ロードチャンク」画面をポップするものはありません。したがって、特にゲームを初めて使用するOPにとっては、これまで見たことのない比較的専門的な用語よりも理解しやすいかもしれません。
gbjbaanb 16

6

他の人が言ったように、マップを(たとえば配列に)保持し、その可視部分を画面に描画し、画面から読み戻さないでください。

ただし、一部の古いシステムでは、文字通りデータを画面外に表示します。たとえば、320x200のディスプレイ用に400x300ピクセルのビデオメモリがあり、それにビューポートを定義します( "start at X = 10 Y = 30")。したがって、レジスタを調整するだけで画面をスクロールできます。バイトを移動するのに必要な10万サイクルを費やす必要はなく、ビデオハードウェアが読み取りを開始する場所を変更するだけです。

NESにはこれがあり、タイルベースのシステムと組み合わされています:http : //wiki.nesdev.com/w/index.php/PPU_scrolling

NESには十分なRAMがないため、メモリ内に完全なイメージを構築することはありません。代わりに、2画面幅のタイルのセットを定義するRAMアレイがあります。タイルの種類ごとに1バイト。ビデオハードウェアは、タイルとX / Yオフセット座標を参照して、どのピクセルをどのポイントに表示するかを決定します。


6
本当ですが、それは実装の詳細です-主な原則は、まだいくつかの論理状態を持ち、それをレンダリングすることです(そして、私が言ったように、その一部をキャッシュし、すでに次の視点に来るものを準備します)。
ポリノーム

2
@Polygnomeまあ、私は画面ゲーム状態である多くのゲームを書きました。4000バイトのVRAMで何ができるかは驚くべきことです!:)
ルアーン16

1

さて、この種の質問をするのであれば、ゲームを作ることができるまでに長い道のりがあります。しかし、質問の核心をつかむと、プログラムは、プログラムのバックエンドにある変数に多くの異なるものの状態を保存できます。いくつかの例を見てみましょう。

マリオブラザーズ(または同様の)は、あなたがいるレベルの状態を保存します。ブロックがヒットしたかどうかに関係なく、あなたが死ぬまでにどれだけ進んだかを含むかもしれません。よりオブジェクト指向の意味では、ゲームは「ここにブロックである」とだけ言って、ブロックが存在します。その後、ブロックにヒットすると、ブロックは自身の内部状態を「ヒットしました」と変更します。そのようなデータは、さまざまな方法で保存できます。

ワードプロセッサは、そのデータをデータ構造に保存します。現在、これらの多くとそれらを実装できる多くの方法がありますが、おそらく何らかの形のツリーを使用しています。ツリーには、少なくとも1つのノードがあります。左に進む前に追加されたもの。その後に追加されたものはすべて右に移動します。3つのノードを追加すると、2つのノードが中間ノードからぶら下がります。また、ツリーはどこにでも新しいピースが追加されるとさらに大きくなり、ツリー自体が再構築されます。 ツリーの例 または、敵がさまようシューティングゲームを考えてみてください。それらのそれぞれには、場所や生活などを追跡する変数があるため、傷つけたときに傷ついたことを覚えています。

これらすべてのことには、データ構造の知識が必要です。画面に表示されるものをはるかに超えています。配列、リスト、ハッシュ(辞書またはマップと呼ばれることもある)について読んでから、問題に戻ることをお勧めします。

ここにいくつかの良い出発材料があります:


0

ある程度まで、これは3Dのレンダリング方法の関数です。たとえば、OpenGLは、XYスクリーン空間で-1.0、+ 1.0の範囲外のジオメトリを自動的にカリングします(Zはより複雑ですが似ています)。カリングされたジオメトリは、フラグメント(およそピクセル)を生成しないため、レンダリングのためにシステムに送信されても​​、実際の画像に変換されることはありません。いずれにしても、レンダーウィンドウの外側のスペースに書き込むことはできません(すべてが正常に機能している場合)。

状況によっては、最適化としてこの動作に依存するだけで十分です。ただし、ビデオカードが表示内容を認識する前に、すべてのゲームデータを少なくとも1つのレンダリングステージ(頂点シェーダー)に渡す必要があります。Skyrimのようなものでは、それは非現実的です。レンダリングパイプラインを介して世界中のすべての頂点を送信する必要があるだけでなく、すべての頂点をシステム/ビデオメモリにロードする必要があります。可能であっても、それは非効率的です。

そのため、多くのゲームでCPUベースのカリングが使用されます。彼らは通常、ある種のLOD(詳細レベル)システムを実装します。このシステムでは、資産の品質と存在が、特定のコンテキストでの評価の重要性によって影響を受けます。山から50マイル離れている場合、ピラミッドメッシュは山の許容範囲内の近似値です。他の山でブロックされているなど、まったく見えない場合は、ロードする必要もありません。これを行うためのより複雑な方法がいくつかありますが、これらはこの質問で要求された深さに直接関連するとは思わないトピックですが、最も一般的な例の1つについてテッセレーションを見てください。

これの本当の要点は、ビジュアルはゲームの製品にすぎないということです。実際のデータは、ほとんどの時間に表示されているか表示されていないかとは直接関係がなく、データがさまざまな段階でフィルター処理されて、画面に画像が書き込まれる時点に到達する前に余分な情報が削除されます。エンジンの設計によっては、同じゲームに2Dと3Dのインターフェイスを持たせるなどの可能性がある限り、ビジュアルは実際のゲームロジックから極端に切り離される可能性があります。多くのゲームエンジンがまったく出力せずに実行することも可能です。ゲームAIのテストに使用される場合があります。

ただし、ここで事態は複雑になります。マリオのゲームのような単純なものでは、たとえ敵が見えなくても、レベル内のすべての敵の動きを計算することは非常に法外ではありません。現代の状況では、画面外で何が起こっているかは、真剣に検討すべき実際の問題です。NPCの都市全体が複数ある場合、プレーヤーが別の都市にいるときなど、完全にcompletelyされたときの行動をどのように処理しますか?マップ全体で何百ものNPCの決定を本当に計算したいですか?通常、答えは「いいえ」ですが、そうしない場合の正確なアプローチはさまざまであり、ゲームに何らかの影響を与える可能性があります。

これが今の物事の仕組みであることに注意することが重要です。古いマリオゲーム自体は、当時のハードウェアの極端な制限を考えると、非常に異なる方法でプログラムされた可能性があります(正確な方法を話すことはできません)。3Dの概念は当時存在していませんでした。しかし、今日では、完全に2Dであるゲームも含め、ほとんどすべてのゲームで、3Dレンダリングが何らかの形で使用されています。最新のビデオハードウェアは最初に3Dであり、2Dレンダリング(少なくともハードウェアを適切に使用している場合)は、単に3次元を無視します。


LoDテクニックに加えて、シーングラフをこの答えに追加するとよいでしょう。世界をメモリに保持し、ビュー内にあるものに基づいて「CPUカリング」することができます。
gbjbaanb 16

0

あなたの質問に答えるには、ビデオゲームは、画面とは関係のない抽象的なデータ構造でゲームの世界の状態を保持します。これは、必要に応じて(つまり、プレーヤーの場所に応じて)画面にレンダリングされます。

ビデオRAMを状態の目的に直接使用するゲームは、80年代の8ビット、おそらく16ビット時代でもありましたが、そのプラットフォームまたはRAMをKBで埋めるµC向けに開発している場合を除きます。 GBのことは忘れてください。

とはいえ、あなたはプログラミングに関連するものすべてに非常に慣れていないようです。最初に非常に簡単なことをプログラミングし、段階的に進めることをお勧めします。たぶん、テキスト入力/出力のみを持つもの(単純なプロンプトなど)。正直に言うと、私がそれをしたのはおよそ30年前なので、あなたにとって本当に良いリソースはありませんが、あなたの地元の図書館はプログラミングよりも良いスタートを切るためにインターネットよりも優れているかもしれません

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