#概要
オンラインゲームの勉強の為に参考になりそうなサイトを探していたところ、元祖3Dマルチプレイ対応FPSゲームであるQuakeのソースコードがオープンソースで公開されているのを見つけた。
更にそのソースコードの概要をレビューしてくれているサイトがあったので、これを自分の勉強用に和訳したものをメモとして残しておく。
#Quake Engine code review : Architecture (1/4)
私は喜んでQuake Worldのソースコードを読み始めました。 ここで私が理解したことは、誰かがソースコードを理解する助けとなればと思います。
この記事は4つの部分に分かれています
1.Architecture section(本記事)
2.Network section
3.Prediction section
4.Rendition section
#Quake Client
Quakeを研究するための出発点として、qwcl(クライアント)プロジェクトがあります。 エントリポイントWinMainはsys_win.cにあります。 コードの簡単な要約は次のとおりです。
WinMain
{
while (1)
{
newtime = Sys_DoubleTime ();
time = newtime - oldtime;
Host_Frame (time)
{
setjmp
Sys_SendKeyEvents
IN_Commands
Cbuf_Execute
/* Network */
CL_ReadPackets
CL_SendCmd
/* Prediction//Collision */
CL_SetUpPlayerPrediction(false)
CL_PredictMove
CL_SetUpPlayerPrediction(true)
CL_EmitEntities
/* Rendition */
SCR_UpdateScreen
}
oldtime = newtime;
}
}
ここから、Quake Worldの3つの重要な要素を特定できます。
1.Network CL_ReadPackets and CL_SendCmd
2.Prediction CL_SetUpPlayerPrediction, CL_PredictMove and CL_EmitEntities
3.Rendition SCR_UpdateScreen
ネットワーク層(ネットチャネルとも呼ばれる)は、ワールド情報をフレーム変数(frame_tの配列)に出力します。 それらは、予測レイヤによってピックアップされ、衝突が処理され、可視性エクリプス(cl_visedicts)およびPOV定義の形式でデータが出力されます。 VisEdictsは、シーンをレンダリングするためのPOV(cl.sim *)変数に加えて、レンディションレイヤーによって使用されます。
##setjmp:
コードウェイポイントを設定します。悪いことが起きた場合、プログラムはここに戻ります。
##Sys_SendKeyEvents:
Windows OSメッセージを取得し、最小化など...エンジン変数を適切に更新します(たとえば、ウィンドウが最小化されている場合、ワールドはレンダリングされません)。
##IN_Commands:
ジョイスティックの入力を取得します。
##Cbuf_Execute:
すべてのゲームループで、バッファ内のコマンドが実行されます。 コマンドは主にコンソール経由で生成されますが、サーバーや直接のキーストロークから来る場合もあります。
ゲームはコマンドバッファ内のexec quake.rcで始まります。
##CL_ReadPacketsおよびCL_SendCmd:
エンジンのネットワーク部分の役割を担っています。 CL_SendCmdはマウス/キーボード入力を取得し、コマンドを生成して送信します。 Quake WorldはUDPを使用しているため、信頼性は主にnetChannelパケットヘッダーのsequence / sequenceACKのセットを介してreplicatedされます。 さらに、最後に送信されたコマンドは系統的に再送されます。 フロー制御に関して、クライアント側に制限はなく、更新はできるだけ速く送られる。 サーバー側では、パケットが受信され、送信レートが「チョーク」制限を下回っている場合にのみ、メッセージがクライアントに送信されます。 この制限はクライアント側から設定され、サーバーに送信されます。
上記の詳細はNetwork sectionパートに書いています。
CL_SetUpPlayerPrediction、CL_PredictMoveおよびCL_EmitEntities:
エンジンの予測部分だけでなく衝突の役割を担っています。 目標は、主にネットワーク通信の待ち時間に対処することです。
上記の詳細はPrediction sectionパートに書いています。
##SCR_UpdateScreen:
エンジンのレンダリングの役割を担っています。 この部分では、BSP / PVSが広く使用されています。 これは、include / defineに基づいてコード内でフォークが発生する場所でもあります。 Quakeエンジンは、純粋なソフトウェアまたはハードウェアを高速化して世界をレンダリングすることができます。
上記の詳細はRendition sectionパートに書いています。