Network
game
GameEngine

Quake Engine code review : Architecture (1/4)の和訳をしてみた

More than 1 year has passed since last update.

概要

オンラインゲームの勉強の為に参考になりそうなサイトを探していたところ、元祖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 *)変数に加えて、レンディションレイヤーによって使用されます。

image.png

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パートに書いています。