13

ゲーム エンジン (プレイヤーの動きなどを計算する) がサーバー上で実行され、レンダリングとキーボード/マウスの処理がクライアントによって行われる小さなサッカー ゲームを設計しています。使いたいサーバー(Haskell)について

  • クライアント/サーバー通信用の Happstack
  • Yampa / ゲームエンジンの Reactulate

約 20 ミリ秒ごとに、クライアントはキーボードとマウスのイベントを HTTP GET 経由でサーバーに送信し、現在のゲーム ステータス (JSON でエンコードされたボールとプレーヤーの位置) を受信して​​レンダリングする必要があります。ゲーム ループ、入力処理、およびレンダリングに SDL インフラストラクチャを使用することを考えています。

サーバーは基本的に 2 つのスレッドを実行します。happstack サーバーは HTTP GET を受信し、キーボード/マウス コマンドをキューに入れ、2 番目のキューから現在のゲーム ステータスを読み取り、HTTP GET リクエストに応答します。

2 番目のスレッドは、Yampa Arcade の論文で説明されているように、Yampa ゲーム エンジンを実行します。ゲーム エンジンは新しいラウンドを可能な限り迅速に (ティックなしで) 計算し、結果をレンダリング キューに入れます。

建築

一般的な質問: これは実行可能なアーキテクチャのように見えますか?

具体的な質問: サーバー側のレンダリング キューをどのように設計しますか? これには Chan を使用しますか? ゲーム エンジンがクライアント側の「カチカチ」よりも平均して速い場合、キューはどんどん長くなります。これは、Chan でどのように処理できますか?

あなたのコメントは大歓迎です!

4

3 に答える 3

6

ゲーム自体についてもう少し詳しく教えてください。サッカーの試合について考えるとき、リアルタイムのフィードバックが必要なゲームを思い浮かべます。そこでは、入力を即座に処理する必要があり、プレーヤーの入力情報がネットワーク経由ですぐに送信されることを期待します。20 ミリ秒はかなりの遅延であり、プレイヤーがキャラクターを動かそうとキーを押したままにすると、特定のタイプのガベージ コレクターで経験したようなぎくしゃくした感じになると思います。

また、なぜそのようなゲーム (どのゲームでも) に HTTP を使用したいのかわかりません。ほとんどすべてのゲームが UDP を使用しており、おそらくあなたのタイプのゲームではこのルートをたどるでしょう。このチュートリアルは、そのようなことについて学ぶのに最適です。

また、ネットワーク データ形式の選択についても質問します。受信/送信時に自明ではない解析/フォーマットを必要とする形式が必要なのはなぜですか? 大量のデータを送信すると、多くの場合、かなりの時間がかかると思います。文字列を使用する場合は、最小限の解析しか必要としない最も単純な形式を使用しようとします。私が取り組む関連システムでは、通信にソケットを使用するマルチプロセス リアルタイム システムでした。当初はネットワーク データ形式として xml 文字列を使用していましたが、非常に非効率的で、すべてのプロセスがすべて同じマシン上にありました。

Yampa とサーバー サイド レンダリングに関して、ゲームのコンテキストで FRP をゲーム ロジックとエンティティを実装する手段と考えると、ほとんどのネットワーク ゲームにはサーバーとクライアント エンティティがあると思います。通常、レンダリング可能なオブジェクトはクライアント エンティティであり、レンダリング不可能なオブジェクトはサーバー エンティティです。一部のエンティティは両方で表現されていると思います。その場合、おそらくサーバー側とクライアント側の両方で Yampa を実行する必要があり、サーバー側でのレンダリングに関連するものはすべて回避しようとします。レンダリング可能なオブジェクトは、主にクライアント側に固執する必要があると私は信じています。サーバーからレンダリング コマンドを取得したい特定の理由はありますか?

于 2011-02-12T01:03:40.867 に答える
4

最新のゲーム状態だけを提供したい場合は、チャンやキューを使用せず、samplevar を使用してください: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control- Concurrent-SampleVar.html

于 2011-02-12T01:33:35.517 に答える
2

興味がある方のために、Haskell で同様のサーバー クライアント ベースのサッカー ゲームを書いたこともあります。ソースコードはgithub ( serverclient ) にあります。当時私は Haskell の初心者だったので、スレッドに関するいくつかの問題に遭遇し (そしてそれらについてブログに書きました)、プロジェクトを実際に完了することはできませんでしたが、少なくともコードからそれを行わない方法を確認できます。(結局、私はサーバー/クライアント アーキテクチャを捨てて、freekick2を書きました。) ただし、アーキテクチャ自体は実現可能だと思います。

ただし、snk_kid が書いているように、HTTP を使用する理由がわかりません。(顕著な) 遅延なしでネットワーク全体で実行するには、おそらく UDP とクライアント側の予測を使用する必要があります (ここにいくつかの有益な資料があります)。

于 2011-02-14T18:42:36.407 に答える