タグ付けされた質問 「architecture」

コードの構造。ゲームエンジンの内部設計に関する質問。

2
マルチプレイヤーゲーム用のシンプルなゲームサーバーを構築する方法
シンプルなゲーム用のシンプルなマルチプレイヤーゲームサーバーを作成したいと思います。 このゲームはCommand&Conquerに似ていると思われ、戦車と兵士が数人います。1人の兵士を選択し、マップをクリックして、兵士が行くべき場所に移動できます。兵士が行けなかった場所に来ると、歩き回ります。そして、兵士は敵に撃ち落とされることができます。 ゲームサーバーをどのように構築し、クライアントで何をすべきですか? つまり、兵士がXからYに移動するがZの建物の周りを移動する場合、サーバーは兵士がいる場所を正確に計算できなければならない(敵が彼に撃たれた場合)、そしてクライアントはまた、兵士を描く。 サーバーで何をすべきか、そして私はこれのためのプロトコルを設計しなければならないと思います。サーバーはゲームの状態と時間を追跡する必要があると思います。これを行う方法についての提案はありますか?またはいくつかの読書をお勧めできますか?

3
クライアントをサーバーと相互に同期する
すべてのクライアントをサーバーと相互に同期させる最良の方法は何ですか? 現在、2つのアプローチが考えられています。 クライアントがサーバーに何かを送信すると、サーバーはすぐにすべてのクライアントにメッセージを送信します。 いくつかの時間遅延の導入により、サーバーはすべてのクライアントにメッセージを送信しますt。 2番目のアプローチは、クライアントをよりよく同期させる可能性が高いようです(ある程度の遅延に対応しているため)。しかし、応答性が大幅に低下するかどうか(つまり、ユーザーが「ジャンプ」をクリックし、ボタンを押すことと実際にジャンプすることの間に顕著なギャップがある)かどうかと思います。 クライアントに自分の位置を計算させる可能性もあります(サーバーが「ジャンプした」と言うのを待たないでください)。しかし、避けられない遅延のために、クライアントは非常に非同期になります。 次に、TCPとUDPの全体の問題があります。私たちはそれを速くしたいのですが、あなたが思っていたのとは完全に異なる場所にいるとサーバーが言うのも嫌です。 これらのすべての競合する要求により、この問題への取り組み方は非常に不確実になります。これらのアプローチ(またはその他のアプローチ)のうち、クライアントとサーバーをすべて同期させるのに最適なのはどれですか。業界で実際に使用されているのはどれですか?

1
Entity System Architecture with Task Based Parallelismの使用
バックグラウンド 私は自分の暇な時間にマルチスレッドゲームエンジンの作成に取り組んでおり、エンティティシステムを既に作成したものに組み込むための最良の方法を決定しようとしています。これまでのところ、私は自分のエンジンの出発点としてIntelからのこの記事を使用しました。これまでのところ、タスクを使用して通常のゲームループを実装しており、システムやエンティティシステム、あるいはその両方の組み込みに取り掛かっています。私は過去にアルテミスに似たものを使ったことがありますが、並行性が私を捨ててしまいます。 Intelの記事では、エンティティデータのコピーが複数あり、各エンティティに加えられた変更が完全な更新の最後に内部的に配布されることが推奨されているようです。つまり、レンダリングは常に1フレーム遅れますが、得られるべきパフォーマンス上の利点を考えると、許容できる妥協案のようです。ただし、Artemisのようなエンティティシステムの場合、システムごとに各エンティティが複製されるため、各コンポーネントも複製する必要があります。これは実行可能ですが、多くのメモリを消費するように思えます。これを議論するインテルのドキュメントの部分は主に2.2と3.2.2です。探しているアーキテクチャを統合するための適切なリファレンスが見つかるかどうかを確認するためにいくつか検索を行いましたが、まだ有用なものを見つけることができていません。 注:このプロジェクトではC ++ 11を使用していますが、私が求めていることのほとんどは言語にとらわれないものでなければならないことを想像しています。 可能な解決策 EntitiesとEntityAttributesの作成と管理に使用されるグローバルEntityManagerを用意します。更新フェーズでのみ読み取りアクセスを許可し、すべての変更をスレッドごとにキューに保存します。すべてのタスクが完了すると、キューが結合され、それぞれの変更が適用されます。これは、同じフィールドへの複数の書き込みで問題が発生する可能性がありますが、それを整理する優先システムまたはタイムスタンプがあると確信しています。変更の配布段階でシステムにエンティティへの変更をかなり自然に通知できるため、これは私にとっては良いアプローチのようです。 質問 それが理にかなっているかどうかを確認するために私の解決策についてのフィードバックを探しています。私は嘘をついてマルチスレッドの専門家であると主張することはありません。私はこれを主に練習のために行っています。複数のシステムが複数の値を読み書きしている私のソリューションからいくつかの複雑な混乱が発生することを予測できます。私が言及した変更キューも、PODを使用していないときに起こりうる変更を簡単に通知できるようにフォーマットするのが難しい場合があります。 フィードバック/アドバイスは大歓迎です!ありがとう! リンク集 http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine http://gamadu.com/artemis/ http://www.gamedev.net/topic/560083-rendering-in-a-task-based-multithreaded-environment/(この投稿の投稿には記載されていませんが、同様のソリューションが記載されています)

2
エンティティシステム内でのエンティティの割り当て
エンティティシステム内でエンティティをどのように割り当て/類似する必要があるのか​​、よくわかりません。私にはさまざまなオプションがありますが、それらのほとんどには短所が関連付けられているようです。すべての場合において、エンティティはID(整数)に似ており、おそらくラッパークラスが関連付けられています。このラッパークラスには、エンティティにコンポーネントを追加/削除するメソッドがあります。 オプションについて言及する前に、ここに私のエンティティシステムの基本構造を示します。 エンティティ ゲーム内のオブジェクトを説明するオブジェクト 成分 エンティティのデータを格納するために使用されます システム 特定のコンポーネントを持つエンティティが含まれています 特定のコンポーネントでエンティティを更新するために使用されます 世界 エンティティシステムのエンティティとシステムが含まれています エンティティを作成/破棄し、システムをそこに追加/削除できます 私が考えた私の選択肢は次のとおりです: オプション1: エンティティラッパークラスを保存せず、次のID /削除されたIDのみを保存します。つまり、エンティティは次のように値で返されます。 Entity entity = world.createEntity(); これは、この設計にいくつかの欠陥があることを除いて、ententxによく似ています。 短所 エンティティラッパークラスが重複している可能性があります(コピークターを実装する必要があり、システムにエンティティを含める必要があるため) エンティティが破棄された場合、重複するエンティティラッパークラスの値は更新されません オプション2: エンティティラッパークラスをオブジェクトプール内に保存します。つまり、エンティティは次のようにポインタ/参照によって返されます。 Entity& e = world.createEntity(); 短所 重複するエンティティがある場合、エンティティが破棄されると、同じエンティティオブジェクトが別のエンティティの割り当てに再利用されることがあります。 オプション3: 未加工のIDを使用し、ラッパーエンティティクラスを忘れます。これの落とし穴は、それに必要な構文だと思います。これを実装するのが最も簡単で簡単に思えるので、これを行うことを考えています。構文が原因で、私はそれについてかなり確信が持てません。 つまり、このデザインでコンポーネントを追加するには、次のようになります。 Entity e = world.createEntity(); world.addComponent<Position>(e, 0, 3); これに付け加えて: Entity e = world.createEntity(); e.addComponent<Position>(0, 3); 短所 …

2
SQLデータベースを使用してデスクトップゲームにデータを格納する必要がありますか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ゲーム開発スタック交換のトピックになるようにします。 2年前休業。 ゲームエンジンの開発 コンピュータゲームとそのエンジンを計画しています。一人称視点の3次元の世界があり、現時点ではシングルプレーヤーになります。プログラミング言語はC ++で、OpenGLを使用しています。 データ中心の設計決定 私の設計上の決定は、グローバルイベントマネージャーとグローバルデータマネージャーがあるデータ中心型アーキテクチャを使用することです。物理、入力、サウンド、レンダラー、aiなどの多くのコンポーネントがあります。各コンポーネントは、イベントをトリガーしてリッスンできます。さらに、各コンポーネントはデータの読み取り、編集、作成、削除を行うことができます。 問題はデータマネージャーについてです。 リレーショナルデータベースを使用するかどうか SQLiteやMySQLなどのSQLデータベースを使用してゲームデータを保存する必要がありますか?これには、アイテム、キャラクター、インベントリなどの実質的にすべてのゲームコンテンツが含まれます。さらにパフォーマンスに関連するメッシュとテクスチャを除いて、メモリに保持します。 SQLデータベースは、動くキャラクターの位置などのゲーム情報をリアルタイムで読み書きするのに十分な速度ですか?また、プラットフォーム間の互換性にも注意する必要があります。すべてをメモリに保持する以外に、どのような代替手段がありますか? 利点は MySQLのようなリレーショナルデータベースを使用する利点は、高速な計算を可能にするデータ指向の構造です。エンティティを表すためのオブジェクトは必要ありません。レンダリングに必要なプレーヤーの近くのオブジェクトのデータを簡単にクエリできました。そして、遠くにあるオブジェクトのデータを気にする必要はありません。さらに、ホールゲームの状態はデータベースに保存されるため、savegamesは必要ありません。最後に重要なことですが、ホールゲームの状態が格納されている場所が既にあるため、ゲームをオンラインゲームに拡張することは比較的簡単です。

3
MVCまたはコンポーネント、あるいはその両方?
私は経験豊富な開発者ですが、最近ゲームプログラミングに取り組みたいと思っていますが、ご存知のように、ゲーム開発は他のほとんどのプログラミング形式とはまったく異なります(おそらくオペレーティングシステム開発によってのみ得られます)。 そうは言っても、Mike McShaffryによるGame Coding Complete(ISBN 978-1-58450-680-5)を読んでいます。 もともとは、通常のコンポーネント(SpacialComponent、VisualComponent、EntityLogicComponentなど)を組み合わせたコンポーネントモデルで開発しようとしましたが、McShaffry氏は非常に魅力的に見えるMVCモデルを使用することをお勧めしますが、どうすればよいかわかりません可能な限りコンポーネントモデルで動作させることができますが、コンポーネントがないと、MVCモデルは邪悪なモノリシックな継承モンスターのように見え、あまり柔軟ではないため、あまり興味がありません。 私はこの時点からどこに行くべきかについて本当に混乱しています。 より経験豊富なゲームコーディングブードゥーエキスパートは、考えや推奨事項を持っていますか? どうもありがとうございます!

5
IDを使用して異なる場所で同じゲームエンティティの複数の参照を管理する
私は同様のトピックについて素晴らしい質問を見てきましたが、この特定の方法に対処するものはありませんでした: [XNA Game Studio]ゲームにゲームエンティティの複数のコレクションがあり、多くのエンティティが複数のリストに属している場合、エンティティが破棄されるたびに追跡し、所属するリストから削除する方法を検討しています。 多くの潜在的なメソッドがずさんで複雑なように見えますが、以前に見た方法では、ゲームエンティティの複数のコレクションを使用する代わりに、ゲームエンティティIDのコレクションを使用する方法を思い出しました。これらのIDは、中央の「データベース」(おそらくハッシュテーブル)を介してゲームエンティティにマッピングされます。 したがって、コードの一部がゲームエンティティのメンバーにアクセスする必要がある場合は常に、まずデータベース内にあるかどうかを確認します。そうでない場合は、それに応じて反応します。 これは健全なアプローチですか?オブジェクトにアクセスするたびにルックアップのコストがかかるトレードオフで、複数のリストを格納することのリスク/手間の多くが排除されるようです。


6
ゲームエンジンフレームワークまたはライブラリ[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前休業。 作成を開始する内部ゲームエンジンの計画段階にあります。これは、今後のすべてのゲームで使用されます。しかし、私はそれがどのように構築されるべきかについて少し苦労しています。 選択肢は次のようになります。フレームワークまたはライブラリ。 私の基本的な目的は、エンジンの詳細をできるだけ隠して、スクリプトと構成ファイルで高レベルのゲーム開発をできる限り維持することです。ただし、コアエンジンを将来開発するツールに再利用することもできます。 フレームワークを使用すると、開発を簡単に行うことができますが、その場合はロックインされます。特定のサブシステムのみに関心がある場合は、ライブラリが適しています。ただし、ゲームごとにすべてを一緒に接着する必要があります。 また、別の方法として、すべてのゲームリソースとすべてのサブシステムを処理するスタンドアロンexeとしてエンジンを構築しています。ゲームロジック(およびその他のゲームごとの動的なもの)は、各内部エンジンサブシステムを構成するための構成ファイルを含むスクリプトで排他的に実行されます。 どちらが将来私にもっと柔軟性を与えるでしょう。 ありがとう。 編集:みんなありがとう、私はこれを間違った視点で見ていたと思います。ゲームが何を必要としているのかを事前に知ることなしに、私たちは本当にこのようなものを計画することはできません。これが、すべてのジャンルの一般的なエンジンのようなものがない理由だと思います。 最初に適切なゲームに焦点を当て、次に各ゲームの終わりに、私のワークフロー(または将来のチームのワークフロー)に応じてライブラリまたはフレームワークの適切な抽象化を行う方法を繰り返し分析します。

1
モバイルゲームを作成するときに浮動小数点数または倍精度浮動小数点数を使用する
シェーダーの場合、フロートはパフォーマンスにとって最適な選択肢であるため、フロートを使用する必要があります。ダブルスは遅く、より多くのメモリを使用するため、シェーダーには理想的ではありません。フロートは精度が低く、フロートオーバーフローになる傾向がありますが、速度のトレードオフはモバイルハードウェアで理想的です。 しかし、シェーダーパイプラインに関連しないコードベースの他の場所についてはどうでしょうか。私はエンジンを作成していて、デルタ更新ティックにdoubleを使用し、すべてのユニットをそのデータ型に相対的に保つようにして、doubleを使用する場所がたくさんあるようにします。エンジンのモバイルでもフロートを使用する必要がありますか? エンジンはC ++言語で記述されています

3
ゲームエンジンをゲームエンジンに組み込むことはできますか?
タイトルが「Mostly Civilized:A Hex-based 4x Game Engine for Unity -Part 1」と言っているので、これは私を混乱させます。 Unityはゲームエンジンであり、ゲームエンジン用のゲームエンジンを構築しています。 彼はこれを間違って言いましたか、それともゲームエンジンをゲームエンジンに組み込むことは本当ですか?

4
複数のエージェントによる目標指向の行動計画
私は少し行き詰まっています: シミュレーションゲームにGOAP(目標指向のアクションプランニング、http: //alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf)を使用してAIを実装しました。それはうまくいきます。 今、私はエージェントが協力できることを望みます(例えば、一緒に行動を起こす)。この場合、GoapActionsが緩いカプレットを保持する最高のAIデザインは何ですか? 彼らは一緒に計画すべきですか?(この場合、「世界国家」とは何ですか?)または、彼らは計画を共有する必要がありますか?ある種のメッセージシステム? 例 Agent1:Worldstate Agent 1:isLonely = true 目標Agent1:isLonely = false エージェント1の計画:AskAgent2ToTalk-> TalkToAgent2 Agent2 Worldstate Agent 2:hasWood = false 目標hasWood = true エージェント2の計画:GetAxe-> ChopWood-> BringWoodToSupply この星座を取得するにはどうすればよいですか? Agent1プラン:TalkToAgent2 Agent2プラン:TalkToAgent1-> GetAxe-> ChopWood-> BringWoodToSupply または、彼らが話していて、エージェントの1つが(たとえば、攻撃する敵によって)中断された場合、他のエージェントは、彼のTalktoAgent2アクションが終了したことを知っている必要があります。

4
エンティティコンポーネントシステム-ゲームの進行
私はゲーム開発(プログラミングではなく)に非常に慣れていないので、世界間の通信を処理するための最良の方法を理解しようとしています。私が言っているのはこれです: 私はエンティティコンポーネントシステム(ECS)と、人々がさまざまなワールド/スペース(http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091)の使用をどのように提案するかについて読んでいますゲームのサブセクション。たとえば、HUD、インベントリ、または戦闘/移動は、それぞれ異なるワールド/スペースを取得します(それらは異なるグラフィックスと基礎となるロジックを持っているためです)。 しかし、たとえば戦闘中など、別のスペース/ワールドによってヘルスが処理される場合、インベントリまたはHUDがプレーヤーのヘルスをどのように知っているのかと思いました。 これは、ゲームの進行状況にも適用されます。たとえば、NPCとのダイアログ(ダイアログはポップアップ画面であるため別のスペースになります)ですが、ダイアログで行われた選択(または状態)を他のスペース/ワールドにどのように伝えますか。 。または基本的に、さまざまなスペース/世界でのゲームの進行に影響を与える他のタイプのイベント(健康、マナ、クエスト、ダイアログ、戦闘、インベントリ、hudなど) この種の設計をどのように処理するでしょうか?このような情報をすべて保持する(実装の)シングルトンオブジェクトが必要ですか?それは奇妙なことです。それは、components2回物事をしているように感じる(プログラミングのメインDRYに反対する)このシングルトンオブジェクトに各変更を伝える必要があるからです... 私はここでデザインの点で途方に暮れています。 ---編集--- だから私はコメントで提案された他のいくつかの投稿を読んで、可能性についての一般的な考えを得ましたが、それらのそれぞれには、それらを正しくないようにする1つの大きな欠点があるようです。これらの欠点を解決する詳細を監督している可能性が非常に高いため、自由に修正してください。概要と、いくつかの質問に対する回答を示します。 スペース間でデータを「共有」する3つの主要なオプションが表示されます。ほとんどの投稿はシステム間でのデータ共有に関するものですが、システム間でのデータ共有にも同じことが当てはまると思います。 1.クエリ 例:HUDワールドがプレーヤーの現在のヘルスを知る必要がある場合、HUDワールドは別のワールドを照会して現在のヘルスを要求できます。 欠点:世界はお互いを知る必要があります。これは依存関係の大きな問題であり、デカップリングに反対しています。 2:ダイレクトメッセージング(同期および非同期) 例:戦闘中にプレーヤーのヘルスが変更された場合、この変更について知る必要がある他の世界にメッセージ(同期と非同期、必要なものは何でも)を送信できます。 欠点:それでもデカップリングの問題:世界はお互いについて知る必要があります。 3:間接メッセージング(同期および非同期) <-最適なオプション 例:戦闘中にプレーヤーのヘルスが変化した場合、プレーヤーはメッセージ(同期と非同期、必要なものは何でも)を一般的なメッセージハブに送信できます。この変更について知る必要がある他の世界/システムは、特定のメッセージチャネルにサブスクライブされ、メッセージを読み取ります。 利点:完全に分離され、管理と拡張が容易です。 欠点/不明確:メッセージチャネルは、メッセージを削除する必要があることをいつ知っていますか?または、サブスクライブしているシステムがメッセージを(それ自体のみ)既読としてマークし、新しいメッセージを待つ->しばらくするとメッセージボックスが巨大になる。ワールド/システムはどのように順序を処理しますか?たとえば、フレーム中:HUDがすでにヘルスメッセージをポーリングし、その後ヘルスが変化した場合、次のフレームでHUDが更新されます。一部のアプリケーションでは、これは正しい方法ではない場合があります。 Q:1つのゲームオブジェクトが複数のスペースに存在できます 私は組み込みスペース(ワールドと呼ばれます)に付属しているArtemis ECSフレームワークを使用しています。各エンティティ(およびそれとともにコンポーネントの形式のデータ)はワールド上に作成されるため、ワールド間で共有することはできません。

3
Unityでの惑星サイズの世界のフロート制限の克服
私の知る限り、Unityで世界の原点から100万ユニットを超えることは、浮動小数点の精度の問題のため、ほとんど不可能です。 半径が1M単位を超える世界を作成するにはdouble、座標にvarを使用するか、いくつかの空間分割手法を使用して、大規模なシーンを階層チャンクに分割する必要があります。最小のチャンクは約10000単位です。つまり、各ワールド空間の位置が表現されます。チャンク階層によって、オブジェクトのインとfloat、最後のチャンク内のローカル位置(および場合によっては回転とスケーリング)を表すvarの束。 どちらの方法でも、これを行うには完全に新しい座標系を実装する必要があるため、Unityでそれが可能かどうか、可能であれば、物理学などの既存のUnityシステムでそれをどのように機能させるかについて知りたいのです。 PS惑星の周りで同時に物事を進行させたいので、プレイヤーが移動するときに世界を原点に移動することはできません。 ありがとう!

0
OpenFLを使用したSceneManagerの実装
OpenFLとHaxeを使用して基本的なSceneManagerを実装しようとしています。OpenFLとHaxeの使用経験はあまりないので、いくつか問題があります。 以下は、SceneManagerクラスの設計方法です。 package; import openfl.display.Sprite; import openfl.Lib; class SceneManager extends Sprite { private var currentScene: ...; public function new(rootScene: ...) { super(); currentScene = rootScene; Lib.current.addChild(currentScene); } public function changeScene(newScene: ...): Void { Lib.current.removeChild(currentScene); currentScene = newScene; Lib.current.addChild(SceneTwo); } } 「...」は、どのシーンでも保持できる一般的な「クラス」タイプに置き換える必要があります。 誰かがこれを解決するのを手伝ってくれるなら、私は本当に感謝するでしょう。

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