現代プログラマのタ
第0003回
1億ポリゴン/s が出る機械


 ここに、口証1億ポリゴン/sが出る機械がある。
 諸事情により、名は言えない。

 取り合えず、他で使ってるライトウェーブのモデルを表示してみ
る。
 LWO ファイルを直接読み込み、法線は面倒なので後回しにして、
表示。
 一応、ちゃんと出た。

 って言うか、全部屋・全キャラ・全オブジェクトが出ても処理落
ちしない事実にちょっと、びっくり。
 流石は、口証1億ポリゴン/s が出る機械だ。

 その後、モデルデータを最適化してデータを吐き出すコンバート
の出力部分を変更したツールを作成。
 それで表示してみるが、何かおかしい。

 何だか知らないが、処理落ちしてる。

 最適化して、一部の TRIANGLELIST を TRIANGLESTRIP にしてる
から、本来は速くなってるはずなの意、処理が遅くなっていると言
う、罠。
 原因は簡単。DrawPrimitive の回数が増えたため。
 つまり、元々のポリゴン数が少ないので、最適化の恩恵が得られ
ない訳だ。

 もう一つ。

 モデルのサーフェイス一つ毎に頂点バッファを作ってたのも要因
の一つだった。
 これは早速、モデル一つにつき頂点バッファを一つにする様に修
正。
 これで、SetStreamSource を呼ぶ回数が減ったので、多少の処理
速度改善に。

 で、ここまでで、研究段階と言う理由もあって、表示部分の最適
化は一時終了。

 暫くサウンド関係の処理や頂点シェーダを弄くった後、画面を半
分に切って二人同時プレイ画面を作ってみる。
 今回は最適化を使わず、TRIANGLELIST のみの表示を使用。
 若干、処理落ちする時があるが、まぁまぁ動く。

 さて、四分割ならどうなるか?

 当然の如く、処理落ちしまくる。
 が、いくら、一画面分のデータを四回描画してるとは言え、口証
1億ポリゴン/s が出る機械のはず。
 軽く100万ポリゴンくらいは、出ても良い事になる。
 だって、HALO が画面四分割で動くんだし。

 そこで、処理落ちの原因を考察する。

 画面には FPS 以外に Present 終了時から、Present 開始直前ま
での処理時間も表示している。
 つまり、それが CPU の処理時間となる。

 それを良く見ると、CPU の処理時間は 60FPS(16.67ms) 以下にな
ってる。
 どうも、グラフィックチップ側の処理が重いらしい。

 で、会社の人に見せてる時に、「背面消去したらどうだ?」との
意見が。
 実は最適化したデータはポリゴンの裏表がバラバラだったので、
背面消去はしてなかったのだが、試してみるとちゃんと表示された。
 良く考えてみると、今はライトウェーブの吐き出したままのデー
タなので、問題は無い事に気づく。
 とは言え、改善はしたが処理落ちを無くすまでには至らず。

 で、その時に思いついたのが、フルスクリーン アンチエイリア
シング。
 これを切ったら、処理速度は上がるはず。

 早速、アンチエイリアシングに何を使っているか確認すると、4
サンプルのアンチエイリアシング。
 これは、縦横二倍でレンダリングしてる事を意味する。

 そう言えば、確かに、「フルスクリーン アンチエイリアシング
をかけて、1億ポリゴン/s 出る」とは、誰も言ってない。

 と、言う事で2サンプルに変更すると、画面四分割でも処理落ち
する事は無くなった。

戻る