クライアント:
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 を取得することです。