16

スタンドアロン ゲームの場合、基本的なゲーム ループは (出典: wikipedia)

while( user doesn't exit )
  check for user input
  run AI
  move enemies
  resolve collisions
  draw graphics
  play sounds
end while

しかし、Quake、Ragnarock、Trackmania などのクライアント サーバー型のゲームを開発したらどうなるでしょうか。

ゲームのクライアント部分とサーバー部分のループ/アルゴリズムは何ですか?

4

6 に答える 6

20

それは次のようなものになります

クライアント:

while( user does not exit )
    check for user input
    send commands to the server
    receive updates about the game from the server
    draw graphics
    play sounds
end

サーバ:

while( true )
    check for client commands
    run AI
    move all entities
    resolve collisions
    send updates about the game to the clients
end
于 2009-05-01T15:51:06.003 に答える
12

クライアント:

connect to server
while( user does not exit && connection live)
    check for user input
    send commands to the server
    estimate outcome and update world data with 'best guess'
    draw graphics
    play sounds
    receive updates about the game from the server
    correct any errors in world data
    draw graphics
    play sounds
end

サーバ:

while( true )
    check for and handle new player connections
    check for client commands
    sanity check client commands
    run AI
    move all entities
    resolve collisions
    sanity check world data
    send updates about the game to the clients
    handle client disconnects
end

クライアント コマンドとワールド データのサニティ チェックは、故意のチート (動きが速すぎる、壁を通り抜けるなど) または遅延 (クライアントが開いていると認識しているが、サーバーが認識しているドアを通過する) のいずれかによって引き起こされる「不可能な」状況を取り除くためのものです。閉まっているなど)。

クライアントとサーバー間のラグを処理するために、クライアントは次に何が起こるかについて最善の推測を行う必要があります (現在のワールド データとクライアント コマンドを使用して)。そして、サーバーが後で実際に起こったことを伝えます。通常、これはプレーヤーが違いに気付かないほど十分に近いですが、ラグが大きい場合、またはクライアントとサーバーが同期していない場合 (チートなどにより)、クライアントは次のときに突然の修正を行う必要があります。サーバーからデータを受け取ります。

応答時間を最適化するために、これらのプロセスのセクションを別々のスレッドに分割することに関しても、多くの問題があります。

始めるための最良の方法の 1 つは、アクティブなモッディング コミュニティを持つゲームの 1 つから SDK を取得することです。

于 2009-05-01T16:25:31.820 に答える
3

クライアント部分は基本的に同じですが、置換を除きます

run AI
move enemies
resolve collisions

upload client data to server
download server updates

そして、サーバーは次のことを行います。

while (game is running)
{
    get all clients data
    run AI
    resolve collisions
    udpate all clients
}
于 2009-05-01T15:51:30.793 に答える
3

ほぼ同じものを使用できますが、ほとんどのロジックはサーバー上にあり、タイマー、サウンド、グラフィック、およびその他の UI コンポーネントをクライアント アプリに配置できます。すべてのビジネス ルール (AI、Movements) はサーバー側に入ります。

于 2009-05-01T15:51:32.727 に答える
2

非常に有用であり、読むべき適切な論文は次のとおりです。クライアントサーバーアーキテクチャ

私はそれを読んで、そこから多くのことを学びました。多くの意味がありました。ゲームを戦略的に定義されたコンポーネントまたはレイヤーに分離することで、より保守しやすいアーキテクチャを作成できます。プログラムはコーディングが簡単で、説明したような従来の線形プログラム モデルよりも堅牢です。

その思考プロセスは、「共有メモリ」を使用してプログラムのさまざまな部分間で対話し、シングル スレッドとステップ フォロー ステップのゲーム ロジックの制限を克服するという以前の投稿で明らかになりました。

完璧なアーキテクチャとプログラム フローに数か月を費やし、論文を 1 つ読んだだけで、間違ったツリーを作成していたことに気付くことができます。

tldr; それを読んで。

于 2013-03-26T20:30:03.330 に答える