忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

Xnaでゲームを作るときには

ゲームを作ってみて、いくつか思い知らされたことがあるのでメモしておきます。

1.シェーダはなるべく低いバージョンでコンパイルしよう!

これは当たり前のことだと思えるかもしれません。
あんまり高いバージョンにしてしまうと、そのバージョンに未対応の
GPUでは動かないからです。
でもぼくは実は今まで全部(1.1ではなく)2.0でコンパイルしていたのです。

VertexShader = compile vs_2_0 MyVertexShader();
PixelShader = compile ps_2_0 MyPixelShader();

理由は「いちいち調べるのめんどくさいからもう全部2.0でいいや」というもので、
昨日まではこれでも差し支えなかったのですが、
ついに昨日、「時には1.1にすることも考えなきゃいけないかな」という気分になりました。

古いDellのパソコン(にGPU、ATI Radeon9250を付けたもの)でゲーム
を試しに動かしていたのですが、
なんと弾と爆発が表示されません
これではゲームになりません。
嫌な汗が出ました。

これはGPUがシェーダーモデル2.0に対応していないからだろうと思い、
大急ぎで弾と爆発のシェーダーのバージョンを二つとも1.1に変えました。
(バージョンを下げたことで、使えない機能が出てきて、新しいパソコンでも上手く動かなくなる危険性もありましたが、大丈夫だったようです。)

すると幸い古いパソコンでも上手く弾や爆発が表示されました。
めでたしめでたし

この話の教訓は、「ときどきでいいですから、バージョン関係にも気を使いましょうね」ということです。
ちょっぴり反省です。



2.描画をするときにはパフォーマンスも考慮しよう!

もちろんパフォーマンスを考えすぎてコードが可読性の低い、ぐちゃぐちゃなものになってしまってもいけません。
ものの本によるとパフォーマンスを考えるべきなのはプログラムの2割で、残りの8割はパフォーマンスにさして影響がありません。
そこでぼくは描画するときはパフォーマンスをあんまり考えていませんでした。

しかし昨日、古いDellのパソコンでゲームを動かしたところ、弾を撃ったときに信じられないくらいノロくなってしまうということを発見したのです。
原因はどうやらピクセルシェーダに負荷がかかりすぎているようで、たとえば弾を撃ったばっかりで弾が画面のピクセルの多くを占めるような場合にはものすごく遅くなります。(しかし弾が遠くに行ってしまい小さくなればスムーズに動きます。)
本当に原因がピクセルシェーダなのかはわかりませんが、えらくリッチな描画をやって問題が起きたというのも事実です。
以前は弾はビルボードで描画していたのですが、そのときには快適に動いていました。

つまり描画はパフォーマンスに影響のある2割だったということです。
しかしながら新しいパソコンでは遅くなったりはしていないようなので、弾の描画を以前のようなしょぼいものに戻すのもしのびないですね。
ですから教訓としては、「処理の遅いパソコン(グラフィックスカード)のために複数の描画方法を用意しよう!」といったところでしょうか・・・
でもめんどくさいですね。うーん・・・



(もちろん、この2つの問題は、古いグラフィックスカードを切り捨てることによって無視できるんですけどね)

拍手[0回]

PR