パート2:マルチスレッド
パート3:レンダリング(注ごと-翻訳中)
パート4:Doomクラシック-統合(注ごと-翻訳中)
2012年11月26日、ID SoftwareはDoom 3 BFGエディションのソースコードをリリースしました(ゲームが店頭に登場してからわずか1か月後)。 ほぼ10年前のidTech4エンジンは、idTech 5で使用されているソリューションで更新されています( Rageはこのエンジンの最初のゲームです)。
idTech4拡張エンジンを呼び出します。なぜなら、 これは本質的にidTech4ですが、idTech5要素を使用しています:
- ねじ切りシステム
- サウンドシステム
- リソース管理システム
最も魅力的な側面は、フロー制御システムです。Doom3は、マルチコアシステムの時代のdeveloped明期に開発され、まだほとんどのコンピューターがSMPを使用していませんでした。 今ではルールが変更されており、電話にもいくつかのコアが装備されており、マシンの潜在能力を最大限に活用するにはゲームエンジンをマルチスレッド化する必要があります。
これが、人々がソースコードを理解し、スキルを向上させ、より良いエンジニアになることを促すことを願っています。
最初の連絡
Doom 3 BFGの知識は印象的です。 ソースから開始するには、2つの手順を実行するだけです。
- GitHubにあるソースを取得します。
git clone https://github.com/id-Software/DOOM-3-BFG
- Visual Studio 2010 Expressを開き、F8キーを押してコンパイルします。 できた!
注: Direct3D SDKがインストールされている場合、5つの最小限の警告で完全なプロジェクトが1分以内にコンパイルされます。
デバッグモード
Visual Studio 2010 Expressで調整を開始するには、3つの手順のみが必要です。
- デバッグコマンドラインで、ベースパスを指定します。
+set fs_basepath "C:\Program Files\Steam\SteamApps\common\DOOM 3 BFG Edition" +set r_fullscreen 0
- Doom3BFGプロジェクトを開きます。
- F5を押す
ソースコードの読みやすさ
C ++のサブセット:
Doom 3 BFGはC ++で記述されているため、優れたコードの作成と、目を出血させるほどの嫌悪感の両方に使用できるほど素晴らしい言語です。 幸いなことに、ID Softwareは「C with classes」に近いC ++言語のサブセットを使用していました。
- 例外はありません。
- リンクなし(ポインターを使用)
- テンプレートの最小限の使用
- どこでも定数
- クラス
- 多型
- 継承
また、マルチスレッドにもかかわらず、コードはスマートポインターまたはBoostを使用しません。 なんと安relief(結局、これは通常コードを読めなくするものです)。
コメント
多くのコメントがあり、それらは原則として、次のブロックの最も重要な場所で何が行われるかを1つの文で説明するため、非常に便利です。
ParallelJobList.cpp
例を次に示します。
int idJobThread::Run() { threadJobListState_t threadJobListState[MAX_JOBLISTS]; int numJobLists = 0; int lastStalledJobList = -1; while ( !IsTerminating() ) { // fetch any new job lists and add them to the local list if ( numJobLists < MAX_JOBLISTS && firstJobList < lastJobList ) { threadJobListState[numJobLists].jobList = jobLists[firstJobList & ( MAX_JOBLISTS - 1 )].jobList; threadJobListState[numJobLists].version = jobLists[firstJobList & ( MAX_JOBLISTS - 1 )].version; threadJobListState[numJobLists].signalIndex = 0; threadJobListState[numJobLists].lastJobIndex = 0; threadJobListState[numJobLists].nextJobIndex = -1; numJobLists++; firstJobList++; } // if the priority is high then try to run through the whole list to reduce the overhead // otherwise run a single job and re-evaluate priorities for the next job bool singleJob = ( priority == JOBLIST_PRIORITY_HIGH ) ? false : jobs_prioritize.GetBool(); // try running one or more jobs from the current job list int result = threadJobListState[currentJobList].jobList->RunJobs( threadNum, threadJobListState[currentJobList], singleJob );
一般的に、読者はアルゴリズムの各部分を直接理解します。これにより、人々がより良いコードを書くようになります。結局、現在ソフトウェアを開発しているので、他の人よりも大きなエースであることは重要ではありません。 チームで作業してコードを作成できることも同様に重要です。
- エレガントな設計
- 読みやすい、必要に応じてコメントを使用
Doom 3 BFGは、これら両方のポジションで高いレートを持っています。
何が変わった?
- 2つの「ゲーム」プロジェクト(Doom IIIクラシックおよびRessurection)を1つのプロジェクトに統合
- cUrlを削除しました
- 愚かな名前DoomDLLを削除しました...実際にDOOM3.EXEを生成していました
- md5モデル、アニメーション、カメラパスをエクスポートするための古いMayaツールを削除しました。
- RTInfo / Introspectionを追加する代わりに、TypeInfoを削除しました。
Visual Studioのソリューションエクスプローラーが大幅にクリーンになりました(前後):
Doom 3 BFGサブプロジェクト
プロジェクト
| ビルド
| 観察
|
振幅 | Amplitude.lib | Doom Classicで使用:WAV振幅調整ツール。 |
Doom3bfg | Doom3BFG.exe | Engine Doom 3 BFG。 |
破滅的な | doomclassic.lib | 真剣に再設計されたDoom1 / 2エンジン。 |
外部 | external.lib | jpeg-6およびzlibのソース。
|
Game-d3xp | Game-d3xp.lib | 元のゲーム+拡張機能+新しいレベルを含む、ゲームの単一のライブラリ。 現在はDLLではなく静的ライブラリになっていることに注意してください。
|
idLib | idLib.lib | ファイルシステムを操作するためのidソフトウェアツールキット。
|
ti病 | timidity.lib | Doom ClassicでMIDIファイルをWAV形式に変換するために使用されます。
|
新しいアーキテクチャ
アーキテクチャは元のDoom IIIとは大きく異なります。現在、すべてが1つのモノリシック実行可能ファイルにコンパイルされています(元のDoom IIIは1つの実行可能ファイルとゲームロジックを含む1つのDLLにコンパイルされています)。 これは2つの理由で行われました(主な開発者Brian Harrisによる)。
- PS3 / Xbox360などのコンソールは、最適な方法で動的ライブラリをサポートしていません。
- 開発をスピードアップします。 dllライブラリを使用する場合、メモリの割り当てに問題があります。 これにより、追跡が困難なエラーが生成されます。
コンソールの開発に関連する変更:
最初はPCに焦点を当てたプロジェクトでXbox 360とPS3に焦点を当てることで、多くの重要な更新が行われました。
- 前述したように、ゲーム全体は1つの実行可能ファイルに含まれています。
- ゲームは、PAKファイル(ZIPアーカイブ)を使用してさまざまなパーツを保存します。 DVDドライブの遅延が大きいため、IDソフトウェアは次のリソース配布にプッシュされました。1つのファイルには、単一レベルのダウンロードに必要なすべてが含まれています。
- ゲームアセットはテキスト形式でしたが、ロード時間を短縮するために、モデルやアニメーションなどの一部のアセットがバイナリ(.bmd5meshおよび.bmd5anim)になりました。
- Doom 3は、アスペクト比4で640x480の解像度で動作するように設計されています。3。 現在、ほとんどの場合、テレビとモニターのアスペクト比は16:9であるため、すべてのメニューが再作成されています。 おそらく、開発を加速するために、Adobe Flashに実装されています。 Doom 3 BFGは、独自のFlashインタープリター(/ neo / swf /)を使用します。 繰り返しますが、Flashは開発を高速化するために使用されます。
- シェーダーレンダリングは、GLSL 1.5を使用して書き直されました。 HLSLシェーダーはその場で変換できます。
- 許容可能なフレームレートを得るために、懐中電灯を武器に使用することはできませんでした。 (注:オリジナルでは、「Doom 3 BFGを使用すると、武器にカモでテープを貼ることができますが、パフォーマンス上の理由から影を落とすことはできません。」というフレーズがあります。 「-スコッチテープ、つまり」今、Doom 3 BFGでは、武器に取り付けることができます...」
- なぜなら メニューはクロスプラットフォームになり、PCのレンダリング設定が大幅に失われました:PCとコンソールの両方で使用される単純なバージョンが得られます。
マルチスレッド
古いエンジンと新しいエンジンの開発の間の10年間で、パラダイムシフトが発生しました。「フリーチーズ」は終了し、ゲームエンジンはマルチスレッドを使用して開発する必要があります。 したがって、Doom III BFGで読むべき最も魅力的なものは、idTech5スレッドアーキテクチャです。 (翻訳の第2部の詳細なレビュー)。
レンダリング
主に2つの変更点があります。
- GLSL Shaders 1.5を使用したOpen GL 3.2プロファイル互換性を搭載。
- マルチスレッドの使用(最大4つのスレッドが同時に動作する)。
ドゥームクラシック
Doom III BFGでは、Doom 1とDoom 2をプレイできます。一見したところ、簡単な作業は、古いDoom1エンジンを新しいDoom 3 BFGに統合することです。すべての入力/出力をリダイレクトするだけです。 しかし、PS3とXbox360の分割画面モードを考えると、これは簡単に実装できません。 (翻訳の第4部の詳細なレビュー)
投稿は翻訳ですが、 サンドボックスから公開-投稿の種類を変更できません。 後続のパーツは正しくフレーム化されます。 翻訳エラー、タイプミスを喜んで修正し、hpに書き込みます。
最初の部分のオリジナル -ファビアン・サングラード