「電波とどいた?」
2007/10版 その2

2007/10/16 (火)

Vista さんの罠 (吉里吉里)

吉里吉里自体は Vista で特に問題なく動作してたので、インストーラ関係 以外では困ることはないよねー、とかいってたら罠がありました。

最近は液晶のワイド化が進んでいて、特にノートでは、 等アスペクト比の拡大処理が搭載されていない、もしくは 搭載されていても設定がややこしい上にデバイスドライバごとにばらばらで、 いわゆる「フルスクリーン表示」がユーザの希望する形で表示されにくい 環境が多く出現しています。

これに対するシステム側の対策として、解像度変更はせずに、エンジン側であらかじめ 拡大してしまう方法があり、現行の吉里吉里開発版にもそれをサポートするための機能が 組み込まれています(-fsres オプション関係)。原理は単純で、ダブルバッファ描画にして、 そこから GDI または DirectDraw をつかって引き伸ばし表示をかけています。GDI は 拡大率によっては表示がいまいちになることがありますが、DirectDraw では おおむねきれいに表示されます。

と・こ・ろ・が、Vista 環境では、DirectDraw をつかって引き伸ばし表示を おこなう際に、XP 以前では普通に動くスムージングが有効にならない環境が かなりの確率で存在しているようなのです。デバイスドライバおよび そのバージョンによってかわったりする環境依存の現象なので、 プログラム的にはどうしようもありません。

幸い、吉里吉里開発版の最新版(9/1版以降)では、Direct3D に追加対応しており、 拡大縮小の時に選択することができます。いまのところ、DirectDraw ではジャギっ てた特定のVista環境でも、Direct3D では問題なく表示できてます。もはやデバイス ドライバの開発の焦点がそちらにうつってしまって DirectDraw 関連はいまいち メンテされていないのかもしれません。実際に、ある環境では、それまで大丈夫 だった DirectDraw 指定でのズームが、デバイスドライバを最新にすると ジャギるようになりました(汗)

吉里吉里標準では、この拡大方式は自動判定で、スムージングに失敗していると おもわれる描画方式は除外されるので、おおむねどんな環境でもその時使える最適な 方法が選ばれることになります。とりあえずこれでジャギ問題は解決かなー、と おもいきや、まだありました。ムービーです。

一般的にWindows でのムービー再生には「オーバレイ」を使います。この機能、 ハードウェア動作が有効なときはそのままでも拡大してもきれいに表示されるのですが、 環境&設定依存で、ソフトウエア駆動になり「拡大するとスムージングがきかない」 状態になることがあります。あと、これは吉里吉里固有かもしれないのですが、 フルスクリーン化に DirectDraw を使うと、やはりオーバレイがソフトウェアになるようで 拡大補間がきかない状態になります。それどころか、Vista においては、そもそも ハードウェアによるオーバレイが全くサポートされておらず、拡大表示すると 100% ジャギジャギになります orz

この点においては、吉里吉里のムービー再生ライブラリである krmovie.dll は、 少し前の版から VMR9 によるムービー描画をサポートしており、それに切り替える ことで、拡大時にオーバーレイがジャギる不幸からは無事脱することができました。 VMR が使えないような環境では、オーバレイにフォールバックさせています。 ただし、今公式配布されてる版の krmovie.dll は VMR 再生時にメモリリークのバグが あります。最近修正済み

めでたし、めでたし……とおもいきや、VMR でも Vista の特定環境でジャギる報告が orz

krmovie.dll で VMR 指定時は、Direct3D で最終描画してるそうなのですが、 使ってる API の環境依存による挙動差のようです。ちなみに、同一環境での 吉里吉里本体の描画はきれいに拡大表示されていて、こちらはポリゴン処理で 描画してるようです。

この流れをうけて、 krmovie.dll 最新版ではVMRはポリゴン描画で処理 するようになりました。この最新版では、今のところ、それ以前の krmovie.dll では VMR でジャギってた環境でもスムージングが動作しています。

ただ、いかんせん、バグ対応を超えるレベルの改編なので、いきなり実践投入は不安なため、 年内に出る予定の弊社システム担当作品では、一つ前の krmovie.dll を使って、 「9X系では標準はオーバレイ」「2K/XP では標準は VMR」「Vistaでは標準でレイヤ描画(合成は吉里吉里本体まかせ)」 といった形での対応をかける予定です。Vista 入ってるようなマシンなら、相応のスペック でしょうから、レイヤ描画でも特にパフォーマンス的な懸念はないということでの判断です。

一度サンプルつくってばらまいて、動作状況について大規模検証したほうがいいのかもなぁ。

結論:Vista のオタンコナスー(涙)

現在吉里吉里で任意解像度対応してるところはほとんど無いと思うので いないかなーという気はしますが、同様の問題で悩んでる人の参考になれば 幸いでございます。最新系の krmovie.dll は次の開発版あたりから 同梱されるのではないかと思います。

来年ぐらいの段階では、完全 Direct3D9 専用ベースで、マルチ primaryLayer で、 ムービー再生系も内部統合して、3D描画系混合にも対応した吉里吉里用 DrawDevice がほしいところですね。ベース想定はとりあえずサンプル実装も組んだ Irrlicht だけど、 国産ってことで Selene とかもいいかもなー、とか思ってます。




メールはこちらへ...[わたなべごう (go @(at) denpa .(dot) org)]

この日記は、GNSを使用して作成されています。