LoginSignup
9
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-14

概要

オンラインゲームの勉強の為に参考になりそうなサイトを探していたところ、元祖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パートに書いています。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3