フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんばんは。今回は細かいけどクオリティを左右する大事な要素をクリアーしました。

①だいたいあってる高速アルファブレンディング
②V-Syncとフレームスキップ

①だいたいあってる高速アルファブレンディング
アルファブレンディングとZバッファはほんとに仲が悪いです。最も正しいのはZバッファしないで遠いポリゴンから順に描画する「Zソート」ですが、FPSでそんな悠長なことをしている暇はありません。ゲームにおける十分条件として私は

・不透明なポリゴンは完璧な順序で描画される
・透明なポリゴンが後ろのポリゴンを透かしてしまう『透明マント状態』にはならない

を設定して考えてみました(ここでいう透明は半透明を含みます)。
一つ目は、普通にZバッファを使って不透明ポリゴンを全部描画すれば出来ます。この時、透明なポリゴンが途中に入っていると二つ目の「透明マント状態」が回避できませんので、不透明を先に全部描画して、その後で透明を描画すればよいです。これはマテリアルごとに透明/不透明フラグでも立てて管理すれば実現できます。

これでもほぼ要求通りですが、これだけでは透明なポリゴンどうしの「透明マント状態」が回避できません。そこで透明なポリゴンを描画する際はZバッファをオフにします。ただし完全オフだと不透明ポリゴンに隠れるはずのポリゴンが見えてしまいますので、Z評価は有効のままでZ更新を無効にします。これはSetRenderState(D3DRS_ZWRITEENABLE, FALSE)で実現できます(こちらの記事を参考にさせて頂きました)。
これらにより満足した要素をまとめると、

・「不透明と不透明」、「不透明と透明」の完璧な遠近関係
・「不透明と不透明」、「不透明と透明」「透明と透明」の透明マント完全回避

逆に容認した仕様は、

・「透明と透明」の遠近関係

ですね。ただし、透明ポリゴンというのはもともと後ろが透けて見えるものですから、透明どうしで遠近が少々おかしくてもそんなに目立ちません。

②V-Syncとフレームスキップ
フレーム制御は大事です。フレーム制御を一切しなければ、同じゲームでもPCによって15FPSだったり300FPSだったりしてしまいます(実測値)。そこでゲームは通常「早過ぎたらちょっと待つ(ウェイト側調整)」「遅過ぎたら描画を省略する(スキップ側調整)」という制御をしてゲームシステムのスピードを一定にします(他の流儀もありますが、不死女はこちらの方法を採用しています)。

さて、フレーム制御はtimeGetTimeなどで自作してもいいのですが、もう一つ、PC自体に搭載されているフレーム制御機構も忘れてはなりません。それはV-Sync(垂直同期)です。

V-Syncもフレーム制御に使えるのですが、こいつには「FPSをいくつにするかはゲーム側から設定できるとは限らない」「ウェイト側は調整するが、スキップ側は一切調整してくれない」という欠点があります。特に後者は厳しいです。描画が重くなるとゲーム全体のスピードまで重くなるわけですから、このままではよほど軽いゲームでしか使えません。

ではV-Syncは完全に無視して自前制御だけすればいいように思われますがそれも問題があります。もともとV-Syncは「
画面を一気に描画するタイミングを知らせる信号」ですから、V-Syncに合わせないと「あるフレームを描画中に次のフレームを描画してしまう」という現象が発生します。これは「ティアリング」といい、その描画中だった部分で画面がちぎれているように映ります。静止している場面では境目の前後で画面が変わりませんから全くわかりませんが、動いている場面、特に一方向にスクロールしているような場面では非常に目障りなノイズと化します。

不死女は長らく自前制御とV-Syncを同時に使ってそこそこの結果を得ていました。ただ自前制御とV-Syncのタイミングは完全には一致しませんから、60FPS出ている時にも誤差により無駄なフレームスキップが発生したりします。これは「定期的に1フレームだけカクつく」という現象を引き起こすので、これはあまり気持ちのよいものではありません。

そこで今回は自前制御の方の判定を甘くしました。つまり今までは「(自前実測値で)60FPS超えてたらウェイト、60FPSを下回っていたらスキップ」という判定でしたが、「70FPSを超えてたらウェイト、50FPSを下回っていたらスキップ」というように余裕を持たせたのです。50~70の間では60FPSのV-Syncが働いているものと仮定して自前制御は一切手出ししません。これにより、V-Syncだけで60出るマシンではカクつき・ティアリングの一切ないなめらかな映像が得られ、30FPS程度しか出ないマシンではサクサク軽快な動作が得られました。
スポンサーサイト

[2014/12/30 23:23] | 不死女 -Immortal girl-
|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。