MVC(Model-View-Controller)ゲームエンジンアーキテクチャ-はい、いいえ?[閉まっている]


18

Game Coding Completeという素晴らしい本を読んでいます。その本は、MVC(Model-View-Controller)アプローチを使用することを強く推奨しています。

  1. ゲームアプリケーションレイヤー
  2. ゲームロジック
  3. ゲームビュー

私にとって、このアプローチはモバイルコンピュータゲームにとってはやり過ぎのように見えます。

あなたの意見はどうですか?モジュール間に余分な通信が必要になっても、このアーキテクチャを実装する価値はありますか?この設計は非常に多くのCPUパワーを消費する可能性があり、最終的には、実装されていない場合よりも結果が大幅に遅くなりますか?


5
-1および終了する投票。ゲーム内のMVCについて語る価値のあることは、すべてgamedev.stackexchange.com/questions/3426/…語られました。

かなり厳しいですが、私は本当の推測@Joe Wreschnig ...
スパイ

@chaos:実際、私はあなたの答えに投票しましたが、「パターンが役立つ場合は使用し、そうでない場合は使用しない」という別の回答は本当に必要ありませんでした。または多分私たちがやったが、それはまだ本当に悲しいです。ただし、ゴミ以外の「継承のようなランタイムデザイン」のような式を参照する方法はまだわかりません。

2
@ジョー:ああ、まあありがとう。:) OOPはコストがかからないという議論はやや頭を悩ます。いくつかの標準では、私のようなポイントは必要ないはずですが、初心者は発生するので、間違いなく質問を複製します。また、私のようなサイトに遅れて来た人に、活動が大幅に停止したにもかかわらず、ほんの少しの担当者を集めさせる機能も果たします。:)つまり、いまいましい、私は40Kの担当者がいますが、ここではタグwikiを編集することさえできません。
カオス

回答:


30

単純なモバイルゲームであっても、MVC構造の使用をある程度サポートしています。何もしなければ、それは十分に何度も噛まれていない開発者を悩ます問題に役立ちます:ディスプレイコードをゲームロジックから分離します。

ただし、MVCはすべてのデザインパターンと同様に、あなたの生活を楽にするために存在していることを忘れないでください。つまり、MVCを使用するときに行うべきこととすべきでないことに関する規則のセット内に留まることが、あなたの人生をより難しくしている場合、それを無視します。次の2つのいずれかが発生します。1)後で噛まれ、最初に別の方法でそれを行うと、実際には長い目で見れば人生が楽になった理由を理解するか、2)結果がまったくない。

コンピュータープログラミングは、その性質上、実際に何かを成し遂げるよりもエレガントな原則を堅持することを重視する多くのルールフォロワーを獲得します。彼らにあなたを彼らの一人にさせないでください。あなたのゲームで起こりうる最も重要なことは、それを出荷することです。


親愛なるカオス、私はあなたの答えが一番好きです。したがって、私はそれを私の質問に対する答えとしてマークしています。MVCアプローチは、コード設計に抽象化を追加します。抽象化は通常、余分なコードのステップを追加しますが、より簡単な設計で回避できます。正しく理解したように、MVC設計の結果として追加された抽象化によって生じるコストを心配する必要はありません。
文海。佐取

1
良い答え、それについての+1。理論はすべてうまくいきますが、それをやらなければゲームが出荷されないことがあります。
ジェームズ

@ Bunkai.Satori:抽象化を追加しますが、IMOは有用な抽象化です。私はあなたの最後の声明に同意します、コストがあるという明確化、そしてあなたがそれについて心配する必要はないと思います。
カオス

4

コンパイル時のデザインは、信じられないほどひどいコンパイラーがない限り、CPUパワーを消費しません。オブジェクト指向の言語またはアプローチは、手続き型とパフォーマンス特性に違いはありません。MVCを使用するための追加のオーバーヘッドは発生しません。モジュール性は、ランタイムではなくコンパイル時に存在します。コードがインライン化および最適化されると、まったく違いは生じません。

多くの最新のゲームは、実際にはモデルとビューを別々のスレッドで実行し、ほとんどのプラットフォームで大きなパフォーマンス上の利点を獲得しています。

最終的に、MVCは優れた設計であり、メンテナンスを増やし、バグなどを無料で減らすことができます。使用しない理由ありませんfor手書きgotoのsの代わりにループを使用する理由を尋ねるようなものです。優れたデザインを念頭に置いていない限り、何よりも優れていることは間違いありません。

編集:コンパイル時のデザインはCPUパワーを消費しません。継承のような実行時設計は明らかにそうです。


-1。MVCは設計時の決定です。継承は設計時の決定です。どちらもコンパイル時とランタイムの前に発生します。どちらもパフォーマンスに大きな影響を与えます。インライン化は常にコードを高速化するとは限りません。あなたのスレッド提案は信じられないほど素朴です。無料ではありません。

答えてくれたDeadMGに感謝します。基本的に、すべての抽象化レベルで、より多くの中間ステップが追加されるにつれて、コードはより洗練されます。MVCはより抽象的な設計であるため、同じタスクを達成するためにより多くの手順が必要になります。これは速度に影響を与えます、imo。
文海。佐取

4

ほとんどの場合、コードの明瞭さとプログラムの技術的要件(速度、メモリなど)の間にはトレードオフがあります。オブジェクト指向言語は手続き型言語と比較してオーバーヘッドがありますが、特にコードの長期的なメンテナンス(バグなど)で、手続き型言語よりも多くの利点があり、多くの場合、開発速度も向上することが示されています。

それを念頭に置いて、ゲームプログラマーとしてMVCを実装する価値があると提案します。あなたのコードはオブジェクト指向の原則、特にカプセル化によりよく従い、それを維持するのがずっと簡単になるでしょう(バグの修正や新機能の追加)。

一方、ゲームを実際に終了し、「エンジン」での作業に時間を費やさないようにしてください。

詳細については、「ゲームアーキテクチャでMVCおよびTDDが採用されないのはなぜですか」という質問をお読みくださいそして私の本当に長い答え。


1
オブジェクト指向言語は手続き型言語よりも遅くありません。ビットシフトを行うC ++でコードを記述する場合、Cの場合よりも遅くなりません。言語またはプログラムは、オブジェクト指向であるという理由だけで、手続き型に比べて遅くはありません。プログラムは不十分に書かれているため、パフォーマンスの低下のみを示します。その結果、私はあなたの答えに投票する必要性を感じています。
DeadMG

こんにちはリケット、よる説明ありがとうございます。とても論理的に聞こえます。DeadMG、まあ、あなたは正しいです。反対側では、OOアプローチは手続き型言語よりもコンパイルされたコードに多くの情報を追加すると思います。OO関連コードのこの余分なビットにより、結果のコードが遅くなります。同意しますか?
文海。佐取

3
おっと...確かに、C ++のような単純な行は、Cのa++場合とまったく同じになりますa++aプリミティブ型など)。しかし、内部コードが同一であっても、何かを行う仮想関数を持つ単純なC ++クラスを考えてみてください。この仮想関数は、単純なC関数と比べて大きなオーバーヘッドが発生します。オブジェクト指向言語にはオーバーヘッドがあります。「スピード」と明示的に言ってすみません。追加のメモリ割り当てなどでプログラムが遅くならない場合は、間違いなく正しいです。
リケット

2
関数が仮想の場合、実行時にプログラムが同じ関数の2つの異なるバージョンから選択する必要があることを意味します。(そうでなければ、仮想化しないでしょう。)この場合、とにかく追加の条件付きまたは間接レベルがあり、手続き型言語で自分自身を実装する必要があります(たとえば、関数ポインターまたはswitchステートメントを使用) 。それはオーバーヘッドではありません-それは問題の本質です。
キロタン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.