Wine上のRPGツクール2000作品の動作についてのその後(2008/7/13現在)
Wine上のRPGツクール2000作品について、新しく分かったことの追加とこれまでのまとめ。
(2014/8/24)この記事の内容は古いので、まとめドキュメントを参照。
- メモリ使用量が異常に多くなっていたのは直っている
- 効果音が途中から出なくなる場合について
- OLEエラー・MP3関係の不具合についてのその後
- 安定性
- エラーが出てフルスクリーンにならない場合の対処
- バージョン1.1.41でのRTPインストーラのエラー
- レーティング
メモリ使用量が異常に多くなっていたのは直っている
RPG_RT.exeの実行後、メモリ使用量がかなり多くなる現象がWineのバージョン0.9.43あたりから起こっていたが、0.9.59頃からは改善されたようだ。ただし、OS上の各種パッケージのバージョンも常に上がっている中のため、Wine内の問題と確実に言えるかどうかは分からない。
バージョン1.0の時点でも、この件については正常。
効果音が途中から出なくなる場合について
はじめは効果音が出ていても、途中から鳴らなくなるということがあった。これはwinecfg設定ツールの「オーディオ」タブにある「DirectSound」の「ハードウェア・アクセラレーション」を「Emulation」にすると回避できた*1。「ドライバ・エミュレーション」のチェックは不要。OLEエラー・MP3関係の不具合についてのその後
以前『Seraphic Blue』という作品で、MP3のBGMがかかっている場面で曲がループするあたりで「OLEエラー」が出て100%落ちるという現象が起こっていて、ニューゲーム時にも確実にOLEエラーが出ていた(先に進まない)。Wine 1.0の時点*2でも、エラーの種類は違うものの、先に進まなくなる点は同じだった。具体的には、fixme:quartz:parse_header Not a valid header: XX:XX
が大量に出た後に落ちてしまった。
実際の(ニューゲーム選択以降の)メッセージは
(ここまでに大量の「fixme:quartz:parse_header Not a valid header」) fixme:quartz:parse_header Not a valid header: 94:ca fixme:quartz:parse_header Not a valid header: ca:ca fixme:quartz:parse_header Not a valid header: ca:ff fixme:quartz:parse_header Not a valid header: ca:ff (中略)/rpg_rt.exe: mpegsplit.c:178: FillBuffer: Assertion `parse_header(fbuf, &length, &This->position) == ((HRESULT)0L)' が失敗しました. wine: Assertion failed at address 0xffffe425 (thread 0018), starting debugger... First chance exception: page fault on write access to 0x01d20000 in 32-bit code (0xf7d3d66c). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b EIP:f7d3d66c ESP:0033f8d4 EBP:0033fd10 EFLAGS:00010216( - 00 -RIAP1) EAX:00167e70 EBX:7d6c2ff4 ECX:00009600 EDX:00000000 ESI:7bc518e0 EDI:01d20000 Stack dump: 0x0033f8d4: 7d66c349 01d20000 7bc518e0 00025800 0x0033f8e4: 00000000 7ea79ff4 7ea51899 7ea79ff4 0x0033f8f4: 0033f924 7ea526bb 0000007c 0011dc88 0x0033f904: 0000005c 0033fbf4 7ea79ff4 7ea51899 0x0033f914: 7e1f5aab 7e20dff4 0000007c 00bd6330 0x0033f924: 0033fce4 7e1f07bc 00bd6490 0000007c Backtrace: =>1 0xf7d3d66c memcpy+0x1c() in libc.so.6 (0x0033fd10) 2 0x7d6fed55 in ddraw (+0x2ed55) (0x0033fd40) 3 0x7d701aad in ddraw (+0x31aad) (0x0033fd60) 4 0x00456c6e in rpg_rt (+0x56c6e) (0x0033fd8c) 5 0x00417e5d in rpg_rt (+0x17e5d) (0x0000006c) 6 0x00000000 (0x00000000) 0xf7d3d66c memcpy+0x1c in libc.so.6: repe movsl (%esi),%es:(%edi) Modules: Module Address Debug info Name (101 modules) PE 400000- 4bd000 Export rpg_rt ELF 7b0b6000-7b0f4000 Deferred winemp3<elf> \-PE 7b0c0000-7b0f4000 \ winemp3 ELF 7b0f4000-7b113000 Deferred devenum<elf> \-PE 7b100000-7b113000 \ devenum ELF 7b6ef000-7b704000 Deferred winejoystick<elf> \-PE 7b6f0000-7b704000 \ winejoystick ELF 7bf00000-7bf04000 Deferred <wine-loader> ELF 7bf1c000-7bf31000 Deferred avicap32<elf> \-PE 7bf20000-7bf31000 \ avicap32 ELF 7bf95000-7c000000 Deferred quartz<elf> \-PE 7bfa0000-7c000000 \ quartz ELF 7c1ab000-7c1d4000 Deferred msvfw32<elf> \-PE 7c1b0000-7c1d4000 \ msvfw32 ELF 7c1de000-7c1f3000 Deferred lz32<elf> \-PE 7c1e0000-7c1f3000 \ lz32 ELF 7c1f3000-7c23d000 Deferred dsound<elf> \-PE 7c200000-7c23d000 \ dsound ELF 7c7c3000-7d503000 Deferred libglcore.so.1 ELF 7d503000-7d5a8000 Deferred libgl.so.1 ELF 7d5a8000-7d5c2000 Deferred version<elf> \-PE 7d5b0000-7d5c2000 \ version ELF 7d5c6000-7d6c7000 Deferred wined3d<elf> \-PE 7d5e0000-7d6c7000 \ wined3d ELF 7d6c7000-7d71e000 Export ddraw<elf> \-PE 7d6d0000-7d71e000 \ ddraw ELF 7dae3000-7daf7000 Deferred olepro32<elf> \-PE 7daf0000-7daf7000 \ olepro32 ELF 7daf7000-7db11000 Deferred libjis.so ELF 7db2d000-7db43000 Deferred midimap<elf> \-PE 7db30000-7db43000 \ midimap ELF 7db43000-7dbf9000 Deferred libasound.so.2 ELF 7dbff000-7dc17000 Deferred msacm32<elf> \-PE 7dc00000-7dc17000 \ msacm32 ELF 7dc17000-7dc4d000 Deferred winealsa<elf> \-PE 7dc20000-7dc4d000 \ winealsa ELF 7dfa4000-7dfd8000 Deferred uxtheme<elf> \-PE 7dfb0000-7dfd8000 \ uxtheme ELF 7dfd8000-7dfe3000 Deferred libxcursor.so.1 ELF 7dfe3000-7dfe9000 Deferred libxfixes.so.3 ELF 7dfe9000-7dfed000 Deferred libxcomposite.so.1 ELF 7dfed000-7dff4000 Deferred libxrandr.so.2 ELF 7dff4000-7dffd000 Deferred libxrender.so.1 ELF 7dffd000-7e001000 Deferred libxinerama.so.1 ELF 7e001000-7e022000 Deferred imm32<elf> \-PE 7e010000-7e022000 \ imm32 ELF 7e022000-7e028000 Deferred libxdmcp.so.6 ELF 7e028000-7e02c000 Deferred libxau.so.6 ELF 7e02c000-7e128000 Deferred libx11.so.6 ELF 7e128000-7e139000 Deferred libxext.so.6 ELF 7e139000-7e140000 Deferred libxxf86vm.so.1 ELF 7e140000-7e158000 Deferred libice.so.6 ELF 7e158000-7e161000 Deferred libsm.so.6 ELF 7e164000-7e166000 Deferred libnvidia-tls.so.1 ELF 7e166000-7e16f000 Deferred librt.so.1 ELF 7e178000-7e17d000 Deferred euc-jp.so ELF 7e17f000-7e216000 Deferred winex11<elf> \-PE 7e190000-7e216000 \ winex11 ELF 7e290000-7e413000 Deferred libxml2.so.2 ELF 7e413000-7e43d000 Deferred libfontconfig.so.1 ELF 7e43d000-7e452000 Deferred libz.so.1 ELF 7e452000-7e4e6000 Deferred libfreetype.so.6 ELF 7e4e6000-7e50d000 Deferred msacm32<elf> \-PE 7e4f0000-7e50d000 \ msacm32 ELF 7e50d000-7e5a0000 Deferred winmm<elf> \-PE 7e520000-7e5a0000 \ winmm ELF 7e5a0000-7e5f9000 Deferred shlwapi<elf> \-PE 7e5b0000-7e5f9000 \ shlwapi ELF 7e5f9000-7e70c000 Deferred shell32<elf> \-PE 7e610000-7e70c000 \ shell32 ELF 7e70c000-7e7cc000 Deferred comctl32<elf> \-PE 7e710000-7e7cc000 \ comctl32 ELF 7e7cc000-7e7e0000 Deferred libresolv.so.2 ELF 7e7e0000-7e7ff000 Deferred iphlpapi<elf> \-PE 7e7f0000-7e7ff000 \ iphlpapi ELF 7e7ff000-7e860000 Deferred rpcrt4<elf> \-PE 7e810000-7e860000 \ rpcrt4 ELF 7e860000-7e903000 Deferred ole32<elf> \-PE 7e870000-7e903000 \ ole32 ELF 7e903000-7e9a6000 Deferred oleaut32<elf> \-PE 7e910000-7e9a6000 \ oleaut32 ELF 7e9a6000-7e9f7000 Deferred advapi32<elf> \-PE 7e9b0000-7e9f7000 \ advapi32 ELF 7e9f7000-7ea93000 Deferred gdi32<elf> \-PE 7ea10000-7ea93000 \ gdi32 ELF 7ea93000-7ebda000 Deferred user32<elf> \-PE 7eab0000-7ebda000 \ user32 ELF 7ebda000-7ebe5000 Deferred libnss_files.so.2 ELF 7ebe5000-7ec00000 Deferred libnsl.so.1 ELF 7edea000-7ef17000 Deferred kernel32<elf> \-PE 7ee00000-7ef17000 \ kernel32 ELF 7ef17000-7ef3e000 Deferred libm.so.6 ELF 7ef5c000-7f000000 Deferred ntdll<elf> \-PE 7ef70000-7f000000 \ ntdll ELF f7cb4000-f7cbf000 Deferred libnss_nis.so.2 ELF f7cc1000-f7cc5000 Deferred libdl.so.2 ELF f7cc5000-f7e1d000 Export libc.so.6 ELF f7e1d000-f7e35000 Deferred libpthread.so.0 ELF f7e37000-f7e40000 Deferred libnss_compat.so.2 ELF f7e53000-f7f89000 Deferred libwine.so.1 ELF f7f8a000-f7faa000 Deferred ld-linux.so.2 Threads: process tid prio (all id:s are in hex) 00000008 00000009 0 0000000c 00000012 0 0000000e 0 0000000d 0 0000000f 00000014 0 00000011 0 00000010 0 00000015 (D) Z:\[中略]\rpg_rt.exe 00000018 0 00000017 15 00000016 0 <== Backtrace: =>1 0xf7d3d66c memcpy+0x1c() in libc.so.6 (0x0033fd10) 2 0x7d6fed55 in ddraw (+0x2ed55) (0x0033fd40) 3 0x7d701aad in ddraw (+0x31aad) (0x0033fd60) 4 0x00456c6e in rpg_rt (+0x56c6e) (0x0033fd8c) 5 0x00417e5d in rpg_rt (+0x17e5d) (0x0000006c) 6 0x00000000 (0x00000000)
のようになり、MP3ファイルの処理を行う部分に不具合があるように見える。
(ニューゲーム以外の)別のMP3BGMのところでは
(中略) fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0x13be48)->(1,(nil)): Stub fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0x13be48)->(1,(nil)): Stub fixme:quartz:AsyncReader_QueryInterface No interface for {56a868b3-0ad4-11ce-b03a-0020af0ba770}! fixme:quartz:Parser_QueryInterface No interface for {56a868b3-0ad4-11ce-b03a-0020af0ba770}! fixme:quartz:MediaPosition_put_Rate (0x29f0050)->(1.000000) stub! fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0x13be48)->(1,(nil)): Stub fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0x13be48)->(1,(nil)): Stub fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0x13be48)->(1,(nil)): Stub (中略)/rpg_rt.exe: mpegsplit.c:179: FillBuffer: Assertion `length == len || length + 4 == len' が失敗しました. wine: Assertion failed at address 0xffffe425 (thread 0018), starting debugger... First chance exception: page fault on write access to 0x01cf0000 in 32-bit code (0xf7cd566c). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b EIP:f7cd566c ESP:0033f8d4 EBP:0033fd10 EFLAGS:00010216( - 00 -RIAP1) EAX:00167e70 EBX:7d6baff4 ECX:00009600 EDX:00000000 ESI:7bed44a8 EDI:01cf0000 Stack dump: 0x0033f8d4: 7d664349 01cf0000 7bed44a8 00025800 0x0033f8e4: 00000000 7ea6eff4 7ea46899 7ea6eff4 0x0033f8f4: 0033f924 7ea476bb 0000007c 0011dc88 0x0033f904: 0000005c 0033fbf4 7ea6eff4 7ea46899 0x0033f914: 7e1edaab 7e205ff4 0000007c 00186498 0x0033f924: 0033fce4 7e1e87bc 00186a20 0000007c Backtrace: =>1 0xf7cd566c memcpy+0x1c() in libc.so.6 (0x0033fd10) 2 0x7d6f6d55 in ddraw (+0x26d55) (0x0033fd40) 3 0x7d6f9aad in ddraw (+0x29aad) (0x0033fd60) 4 0x00456c6e in rpg_rt (+0x56c6e) (0x0033fd8c) 5 0x00417e5d in rpg_rt (+0x17e5d) (0x0000006c) 6 0x00000000 (0x00000000) 0xf7cd566c memcpy+0x1c in libc.so.6: repe movsl (%esi),%es:(%edi) Modules: Module Address Debug info Name (101 modules) PE 400000- 4bd000 Export rpg_rt ELF 7ad4d000-7ad8b000 Deferred winemp3<elf> \-PE 7ad50000-7ad8b000 \ winemp3 ELF 7ad8b000-7adaa000 Deferred devenum<elf> \-PE 7ad90000-7adaa000 \ devenum (以下同様)
となり、落ちた後のメッセージは似ている。
しかし、これらの不具合は、Win32ネイティブ版のDirectXをインストールし、DLLのオーバーライド設定を行うことで、完全に回避できることが分かった。
設定に関しては「Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(WindowsネイティブDirectXのDLLを使用)」と同様。
(2010/4/10)バージョン1.1.38以上のWineにおいて(Windows版DirectXを用いても)MP3音声の再生が無音になってしまっている。1.1.37ではOK。
(2010/12/1)Wineのバージョン1.3.8の時点ではMP3音声は正常に再生されている(『Seraphic Blue Director's Cut』と『イストワール(Histoire)』で確認)。
(2011/7/26)バージョン1.3.24のWineとwinetricksの20110629版の時点では、WindowsネイティブDirectXの中の該当DLLを用いるためにwinetricksの「directx9」パッケージではなく「quartz」パッケージをインストールする必要がある。
安定性
以前、突然(ランダムに)落ちることがあったのだが、バージョン1.0の時点でも、落ちることはある(どういう状況で発生するかは決まっていない)。プレイに支障をきたすほど頻繁に起こるというわけではなく、たまに起きるという程度ではあるのだが、最後にセーブした後の進行状況は失われるため、「頻繁にセーブをする」以外の対策は難しい。いつ落ちるかが全く分からないため、頻度の目安にすらなるかどうかは不明ではあるが、『Seraphic Blue』を最初から進めていったところ、Episode 8のフィールド移動中に初めて落ちた(ゲーム内での経過時間は約4時間)。
最後に端末に出ていたメッセージは
fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0xXXXXXX)->(1,(nil)): Stub
だが、これは色々なところで発生するメッセージで、特に端末に手がかりを出力するということはなかった。
突然落ちる現象には、端末に大量に出る
err:heap:GlobalFree (0xXXXX): Page fault occurred ! Caused by bug ?
のメッセージのほうが関係しているかもしれないが、よくは分からない。
(2010/4/10)その後、Mandriva Linux 2010.0上では安定している印象があり、『Nepheshel』という作品を最初からエンディングまでやってみた(戦闘を除くプレイ時間は約9時間余り)ところ、一度も落ちることはなかった。Wineのバージョンは1.1.41。
エラーが出てフルスクリーンにならない場合の対処
(2008/7/14)もしDirectDraw Error (DDERR_UNSUPPORTED)
というダイアログが出て起動しないという場合、xrandrというコマンドがインストールされていないことが考えられる。
手元の環境では、このコマンドをインストール後、Xを再起動してからフルスクリーンになるようになったことがある。
もしそれでも動かない場合、あるいはフルスクリーンにしたくない場合などは、デスクトップのエミュレーションが役に立つ。
$ WINEPREFIX=[Wine環境の場所] wine explorer /desktop=rpg2k,320x240 [RPG_RT.exeの場所]
(2008/8/18)ハイバネーションからの復帰後に一時的にxrandrによる解像度変更が利かなくなり、Wineのフルスクリーン表示も利用できないことが分かった。この場合でもデスクトップのエミュレーションは利用可能だが、フルスクリーンにしたい場合は一度ログアウト後、再ログインする*3と直るようだ。
xrandrコマンドについては、フルスクリーンの動作自体には影響しないことが分かったが、アプリケーション終了後に解像度が元に戻らないときには使える。下は実行例。
$ WINEPREFIX=[Wine環境の場所] wine [RPG_RT.exeの場所]; xrandr -s 0
640x480のウィンドウにしてもよいが、内部的には320x240の解像度で、大きくしても無駄に重くなるだけなので、おすすめはしない。ただ、小さいのが気になる場合、Ctrl+Alt++で拡大するとある程度見やすくなるかもしれない。他には、Compiz Fusionなどの拡大機能を用いる方法もある。
バージョン1.1.41でのRTPインストーラのエラー
(2010/4/10)Wineのバージョン1.1.41ではRTPのインストーラが0x8000200E「不明なエラーが発生しました。」となり、途中で終了してしまうが、1.1.39や1.1.42では動作する。レーティング
項目 | 値 | |
---|---|---|
ランク | Silver | |
Wineのバージョン | 1.0 | |
アプリケーションのバージョン | (該当情報なし) | |
不具合回避 | 効果音が途中から鳴らなくなる | winecfgのDirectSoundのアクセラレーション一覧で「Emulation」を選択 |
MIDIデータのBGMが鳴らない(ハードウェアMIDI音源がない場合など) | TiMidity++をALSA MIDIデバイスとして動かす | |
フォントが汚い/読めない | IPAモナーゴシック(バージョン1.0.8)やモトヤのフリーフォントの1つ「NFモトヤシータ゛1等幅」などを使用し、「MS ゴシック」として置換する設定をするかWine環境のC:\WINDOWS\Fonts\へフォントファイル(リンク可)を入れる(さざなみゴシックやUmeplus Gothicでも可) | |
MP3データのBGMが使用される場面で落ちる | Win32ネイティブ版のDirectXを使用(正常動作する)もしくはMP3ファイルを別の場所に移動(曲は再生されない) | |
未解決の不具合 | 頻度は低めだが、突然落ちてしまうことがある | |
その他 | CPU資源に余裕があっても無駄に100%使用するため、RPG_RT.exeに対して最低クロック動作するようにcpufreqdを設定すると省電力効果が非常に高い |
項目 | 値 | |
---|---|---|
ランク | Silver | |
Wineのバージョン | 1.1.41, 1.1.42 | |
アプリケーションのバージョン | (該当情報なし) | |
不具合回避 | 上に同じ | |
未解決の不具合 | バージョン1.1.38以上において、Windows版DirectXを用いてもMP3音声が無音になる | |
その他 | 上に同じ |
使用したバージョン:
- Wine 1.0
- Win32ネイティブ版DirectX June 2008