2012年01月24日

無駄の撲滅

こんにちは、ケイタです。
先週東京で初雪が観測されましたが、
昨晩は積もるほどの雪が降りました雪

そのおかげで今朝は雪化粧ぴかぴか(新しい)された東京の街を見ると言う珍しい体験が出来ましたわーい(嬉しい顔)
今は雪はすっかり止んでいますが、まだ路面は凍結しているところが多いので、
夜になって視界が悪くなり、気付かずに滑って転んだりしないように注意が必要そうですふらふら

さて、ゲーム機のCPUのスペックが上がるのと同様に、GPUの性能もどんどん上がってきていますが、
それでもゲームで表現したいグラフィックスに性能が及ばず、GPUの処理をオーバーしてしまう場合が多々ありますがく〜(落胆した顔)
そこで今回はGPUへの処理負荷軽減の基本的なテクニックを紹介しようと思います手(グー)

紹介するテクニックを実行しても、必ずGPUへの処理負荷が軽減されるとは限りません。予めご了承ください。

2010-10-14-0.png


1何も描画しないのが最速
早速身も蓋もありませんが、プログラムを書かなければバグは発生しないと同様に、
何も描画しなければGPUへの負荷はほぼ0となりますグッド(上向き矢印)

もちろんゲーム中に何も描画されなければゲームをプレイすることが出来なくなってしまうため、
必要最低限なものだけ描画するというのを念頭に置くのが大切ですパンチ

2カメラに写っていないものは描画しない
前述したように、ゲームの中で必要最低限なものだけ描画するのが大事なので、
カメラに写らないもののは描画の処理そのものをキャンセルするようにしましょう。
これは視錐台カリングを行うことで、大部分が解決するのではないでしょうか映画

3使わない描画設定は切る
機能がONになっているだけでGPUへの負荷が大きくなってしまう描画設定がいくつか存在します。
特にアルファブレンドなどはピクセルシェーダーに大きく負荷をかけるので、
うっかり不透明描画を行っているのにアルファブレンドがONになっていたということがないように注意しましょう。
この場合、描画結果は思った通りになっているのにGPUの負荷だけ高いので気付きにくい場合が多いですふらふら

しかし、頻繁に描画設定の切り替えを行うと、動作させるゲームのプラットフォームによっては
かえって処理負荷が高くなることもありますもうやだ〜(悲しい顔)
それを防ぐため、描画前に使うマテリアルごとにソートしておく仕組みや、描画設定のキャッシュ化がされていると尚いいのではないでしょうかるんるん

4無駄なピクセルシェーダーを動作させないようにする
ピクセルシェーダーとは、名前にピクセルと付いているように、描画するポリゴンの1ピクセルごとに動作するシェーダーです。
そのため、描画するピクセルシェーダーのプログラムが遅く、さらにその描画するピクセル数が多ければ多いほどGPUへの負荷は大きくなります。

そのピクセルシェーダーを最低限動作させるのに簡単な方法として、Zテストを利用する方法が挙げられますひらめき

例えば下の画像ではグリとブランが草原の上に立っていますが、画面の多くをブランが占めています。
このブランの後ろには草原が広がっていますが、その草原はブランに隠れて見えないため、
ピクセルシェーダーが動作したとしても無駄ということになりますふらふら

screenShotPC_0002.jpg

このような場合、草原を描画するピクセルシェーダーを動作させないためには、
草原より先にブランを描画してしまうのが最も簡単です。

ピクセルシェーダーが動作する条件として、描画しようとするピクセルの奥行き情報を比較し、
手前であると判断されたらピクセルシェーダーが動きます。
そのため、ブランを先に描画してしまえば隠れている草原のピクセルシェーダーは動作しなくなります。
(ただし、Z比較がONになっている場合に限ります)

つまり、カメラから見て手前にあるものから先に描画すると、無駄なピクセルシェーダーの動作を抑えられる場合が多いということになります。

2010-10-14-0.png


いかがでしたでしょうか?
GPUの性能が上がり、それにつれて求められるグラフィックス表現の幅も広がっていますグッド(上向き矢印)
しかし、その分GPUにかかる負荷も大きくなり続けています。
そのことを踏まえた上で、出来るだけGPUに処理負荷をかけないプログラムをあらかじめ書いておくと、
就職活動用の作品の制作終盤で処理落ちに苦しむことが少なくなるのではないかと思いますわーい(嬉しい顔)揺れるハート

それではまた手(パー)

posted by 管理人 at 23:20 | プログラミング