試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

WOLF RPG エディターのバージョン2.10で作成された作品をWineで3Dモードで動かしたときに文字描画が崩れる現象について(2014年2月末時点)

(2015/12/28)本記事は「WineでWOLF RPG エディター 2.10作品が3Dモード時に文字化けする問題と対処」へ移動した。

(2015/2/2)この問題については「WOLF RPG エディター 2.10作品が3Dモード時にWineで文字化けする問題の邪道な対処」を参照。

以下、以前の内容となる。

2013年12月頃、WOLF RPG エディターのバージョン2.10で制作された作品をダウンロードしてWineで動かしてみたところ、文字の描画が所々おかしくなっているのに気付いた。

  1. 不具合について
  2. バグ報告とその後の流れ
  3. DXライブラリ関係の問題について
  4. Wineにとっての問題点や対策について
    1. 他の影響を受けるプログラムなどについて
    2. WOLF RPG エディター(2.10)作品についての今後の対策

不具合について

この現象は3Dモード(GPU描画モード)での描画時にのみ起こり、ソフトウェアモード(ソフトウェア描画モード)では起こらない。
文字の描画は最初プログラムを開始したあたりでは幾つかの文字だけが崩れている状態だが、しばらく色々なメッセージなどを表示している内に大部分が壊れた描画になってしまう。

作品依存かとも思ったが、バージョン2.10に付属するサンプルゲームで試してみても同様の現象が起きたため、このバージョン(のGame.exe)に固有な不具合と判断した。
winetricksDirect3D関係の設定変更や一部DLLのネイティブ版への置き換えも試したが変化はなかった。
古いバージョンのWineを試したところ、バージョン1.3.5までのバージョンで問題が起こらないように見えたが、これは3Dモードが正しく初期化できずにソフトウェア描画になっているためで動作も遅かった。エディタからサンプルゲームのテストプレイを行うとLog.txt

629:	IDirect3D9Ex オブジェクトを取得します.... 成功
758:	IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました
854:	IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました
951:	IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました
1055:	IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました

といった出力があることからもそれが分かる。
どのタイミングから3Dモードが正しく動作するかを調べたところ、バージョン1.3.5と1.3.6の間の「d3d9: Partially implement IDirect3D9Ex::CreateDeviceEx().」という(つじつまの合う)結果となり、結局「3Dモードが正しく動作する最初のバージョン(のWine)からはずっと不具合が発生する」と分かっただけだった。

バグ報告とその後の流れ

というわけで、この件についてのバグ報告を12月末に行った。その際

  • WOLF RPG エディターはDXライブラリを使用している
  • 同ライブラリのソースは公開されている

ということを添えて記述した。
これに対して1月末にSagawa氏によって「DXライブラリを直接用いた小さなテストプログラムで現象を再現できた」という旨のコメントが出され、その数日後に突然

  • 不具合の原因はDXライブラリの中にあり、同ライブラリの最新バージョン(3.11d)で修正された
  • WOLF RPG エディターの将来のバージョンでDXライブラリのバージョン3.11d以上を用いたバージョンが利用可能になったらそれを用いて動作テストを行ってほしい

という旨のコメントが出された。

DXライブラリ関係の問題について

詳細についてはそこでは語られなかったが、突然このような流れになったことからDXライブラリの作者と何かやりとりが行われていた可能性があると思い、同ライブラリの作者のサイトを探してみた。その結果それが確認できた。
同氏によるとバージョン2.10のWOLF RPG エディター(のGame.exe)に使われているバージョン3.10fのDXライブラリ(先述のLog.txtの冒頭付近にDXライブラリのバージョンが出力されるので確認が可能)について「Direct3Dの仕様上保証されていない動作に依存している」部分があるということで、具体的には「IDirect3DDevice9::UpdateTexture()についてIDirect3DTexture9::LockRect()で作成したダーティ領域(と呼ばれる領域)のみをコピーすることをDXライブラリ側は期待しているが、仕様上ダーティ領域のみをコピーすることは保証されていない」として指摘・報告している。
この不具合は二人のやりとりの数日前に別の方によって報告された不具合の関係で作者が開発(暫定)バージョンで修正済みで、上記の「報告」の翌日に公開されたバージョン3.11dでも修正済みとのことだった。Sagawa氏によるとそのバージョン3.11dではテストプログラムで描画が正常に行われることが確認できており、また、同氏が問題点の対処として提案したIDirect3DDevice9::UpdateSurface()を用いた使用メモリ節約版でも正常な動作を確認したということだった。

Wineにとっての問題点や対策について

他の影響を受けるプログラムなどについて
DXライブラリはWOLF RPG エディターなどのこれを使用するアプリケーションからビルド時に静的リンクされる(ライブラリ部分がプログラム本体と分離されずに取り込まれる)ため、最新バージョンのライブラリで修正されたといってもこの不具合の影響を受けるバージョンのDXライブラリを用いて(取り込んで)作成されたプログラムはWineで動かすと不具合が出るのを避けられない(なのでSagawa氏は「修正された後の将来のバージョンでテストを」とコメントしている)。WOLF RPG エディターは不具合回避としてソフトウェア描画モードが利用できるのでまだよいかもしれないが、DXライブラリにはソフトウェア描画機能無し版も存在するので、そちらの該当バージョンを使って作られたものに当たった場合はどうしようもなくなる。
今回の件についてはDXライブラリのバグという形なのでWineに欠陥があるというわけではないが、多くのWindowsが「ダーティ領域のみをコピーする」という動作をしているのであれば、それが保証されていない動作だとしても、例えばWineレジストリ設定の値によってそのような動作をするようにWineを変更するいったやり方は考えられるかもしれない。ただ、仮にそれが技術的に可能であったとしてもWineのプロジェクト側がそのような動作をするコードを受け入れるかどうかは分からない。

WOLF RPG エディター(2.10)作品についての今後の対策
WOLF RPG エディターのバージョン2.10で作られた作品についてはバージョン2.10の後にDXライブラリのバージョンを3.11d以上にして公開される最初のバージョンが将来公開されるまではソフトウェアモードを利用するしかない。それが公開されたら既存のGame.exeに上書きして動かすことで不具合の解消ができることを期待するが、そのバージョンに上がる際にWOLF RPG エディター内に仕様変更があった場合、バージョン2.10で作られた作品が正常に動かないかもしれない。
WOLF RPG エディターの公式サイトにある「バグ報告スレッド 11」には今回の件についてと「DXライブラリを最新にして、かつ仕様変更のないバグ修正バージョンのリリースをしてほしい」旨を2月上旬に書き込んではいるものの、WOLF RPG エディターの作者が目を通したかどうかは不明で、目を通していたとしてもそのようなバージョンが近い内に公開されるという保証はない。WOLF RPG エディターの過去の「DXライブラリのバージョンの更新」は慎重で、作者のTwitter上の発言によると、作者の環境でバージョンを試しに上げた結果不具合が出て新バージョンの採用が先送りになったこともある。

いずれにしても、今回の件ではSagawa氏の活躍がなければ何も分からないままだった可能性が高く、改めて感謝する。