DOOMの最適化

1993年にid Softwareから発売されたFPSの金字塔「DOOM

ソースコードが1997年に公開されそのコードも環境依存が少なかったがために、その後デジカメとかATMとか芝刈り機とかPDFファイル等々、コンピュータウイルスかよってくらいありとあらゆる機器&媒体に乗り移っていったが、元々が人気作かつ前述のように移植自体はやりやすかったので有志による勝手移植ではない公式移植も数々と出ていた。

 

だが、やはりハードとの相性が悪かったり発売元の不手際によって十分な最適化が得られず発売されてしまったハードが存在する。その中でも有名なのが3DO版とセガサターンであろう。

1997年に発売されたセガサターン版「DOOM」は1996年登場のPlay Station(PS)版をベースとした移植で、PS版はPC版からオミットされた敵やテクスチャが存在するものの、DOOM1と2をカップリングしたことでDOOM1内のマップで2の敵キャラを出すといった変化を持たせたり、効果音や音楽の一新、PSハードの機能を活かしてカラーライティングや効果音にリバーブ加えるといった要素を持たせ当時として完成度の高く高評価を得ていたが、たいしてサターン版はアセットこそPS版と同じなものの性能的に無理だったためにその改善要素であったカラーライティングやリバーブが削除され、サターン特有の変形スプライトによるテクスチャマッピングだとテクスチャを歪んで見えてしまうということでハードウェアに頼らずソフトウェアレンダリングで表示させていて満足なフレームレートが出ていないというものだった。更にオープニングのファイアエフェクトの下側に黒点が表示されている、一部のアニメーション速度が速すぎる(ショットガンで顕著)、などPS版にはなかったバグまで存在する始末。

Play Station版とセガサターン版のそれぞれのプレイ動画

 

そんな不完全なサターン版DOOMだったが、セガ関係の話題を扱うフォーラム「SegaXtreme」でなんと一部バグフィックスやフレームレートの改善を行うパッチを制作した有志が現れる。

ソフトウェアでコピーしていたテクスチャ転送をDMAで行う、キャッシュクリアやバス競合が起きないようにしてSH-2 デュアルCPUの使用効率を改善、Span(DOOMでの床/天井)レンダリングアセンブラで書き換え、SBL(サターン用のライブラリプログラム)とPS版のVsyncコードの不一致で生じていた無駄なVsync待ちの削除、といった改善が行われ現バージョンのV0.2でも元から約1.7~2倍近くのフレームレートを実現している。

1面のプレイとデモ再生の動画

発売版は平均9~11fpsだったのがv0.2パッチで17~22fpsになっていることが確認できる。

 

 

もう一つ駄目移植として有名な3DO

小さいゲーム画面、不安定なフレームレート

発売までの経緯を日本語で翻訳したサイトがあるのでそちらを参考にしてもらった方がよいが(なおリンク先のサイトでも書かれていないがArt Data Interactive社を創設したランディ・スコットは2017年に未成年者へのわいせつ行為で起訴、2022年に収監されている)、壁などはなんとか3DOのCEL Engine(サターンの変形スプライトと同じような)で表示可能なような形式になってはいたものの、開発期間の問題からハードウェア描画が行えず床/天井描画はソフトウェアになっていたんだとか。

この3DO版、実は3年前に移植を担当したレベッカ・ハイネマン氏自身がソースコード公開しており、これを元にしてフレームレートの改善や新たな画面効果を追加した「OptiDoom」という改良版が出されていたりする

これも画面スクリーンをオリジナルより大きくなっているにもかかわらず、様々なグラフィック設定を追加したりして15~20fps程度は出ているほどの最適化っぷり。

 

 

移植しても最適化してもDOOM

 

 

 

ちなみに、発売当時の主力だった486 CPUで動くゲームとしては驚異のグラフィック&速度だったとはいえ、それでもフルフレーム(35fps)で動かなかったり前世代CPUである386でも動かせるようオリジナル(DOS)PC版でも最適化したバージョンが存在したりする。

その一例として「FastDOOM」。これは機能を一切オミットせず、環境(486DX2 66MHz環境での例)によっては1.3~1.5倍のフレームレートを実現しているもの。

FastDOOMの最適化手法についてはDOOMプログラムの解説も行った経験もあるFabien Sanglard氏の記事「Why fastDOOM is fast」で解析されているが、フレームバッファへのアクセス方法やアセンブラといった機種依存となる最適化手法のみならず、前フレームからステータス表示に変化がない場合は関数最初で戻ってしまい描画の更新は行わない、(これは使用するコンパイラやコードの記述によっては自動で行われる可能性があるが)セルフインライン化ループ中で何度も参照するものの参照先に変化のない配列参照では先に変数に入れて更新が終わった最後に配列に戻す、といったDOOMのみならず他のコードでも応用できるようなものでもかなり効果的だというのがわかる。

最適化はこのように基礎的、かつ地味なことをちょっとずつ積み重ねていくことで結果が大きくなっていくのだ。