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

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

Wine上のRPGツクール2000作品の動作についてのその後(2008/7/13現在)

Wine上のRPGツクール2000作品について、新しく分かったことの追加とこれまでのまとめ。
(2014/8/24)この記事の内容は古いので、まとめドキュメントを参照。

  1. メモリ使用量が異常に多くなっていたのは直っている
  2. 効果音が途中から出なくなる場合について
  3. OLEエラー・MP3関係の不具合についてのその後
  4. 安定性
  5. エラーが出てフルスクリーンにならない場合の対処
  6. バージョン1.1.41でのRTPインストーラのエラー
  7. レーティング

メモリ使用量が異常に多くなっていたのは直っている

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において(WindowsDirectXを用いても)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では動作する。

レーティング

Wine レーティング: RPGツクール2000作品
項目
ランク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を設定すると省電力効果が非常に高い
(2010/4/10)フォントについての記述を修正
Wine レーティング: RPGツクール2000作品
項目
ランクSilver
Wineのバージョン1.1.41, 1.1.42
アプリケーションのバージョン(該当情報なし)
不具合回避上に同じ
未解決の不具合バージョン1.1.38以上において、WindowsDirectXを用いてもMP3音声が無音になる
その他上に同じ

使用したバージョン:

  • Wine 1.0
  • Win32ネイティブ版DirectX June 2008

*1:以前もそうだった可能性は高いが、「Emulation」で運用していたため気づかなかったのかもしれない

*2:バージョン0.9.60あたりでも確認

*3:もしそれでもダメならCtrl+Alt+BackSpaceで強制的にXを再起動するとよいかもしれない