2016年3月8日火曜日

Canvasモード実行でメモリリークによるクラッシュを回避する

 本稿は未だ(2016/03/08)に大きな懸案事項のひとつであるツクールMVメモリリーク問題について、プレイヤーの視点から解決方法を提案するものです。

 2016/05/10追記 遠景由来のメモリリーク問題は本体バージョン1.2.0にて修正されました。ただ、メモリリーク以外の問題でもVista SP2互換モードでの実行が問題の解決に繋がる場合があるようなので記事そのものは参考として残しておきます。ただでさえ少ない記事を減らしたくないし……


メモリリークについて

 さて、RPGツクールMVにはメモリリーク問題が存在することは周知の事実かと思います。ご存じない方はこちらをご覧ください。

 そして上記の問題のうち遠景のメモリリークを解決するのが以下のパッチです。JavaScriptのプラグイン形式になっています。上の記事を書かれたliply氏によるものです。

 なんだプラグインが出ているのなら話は終わりじゃん……と言いたいところなのですが、プレイヤー視点から見れば、遊びたいゲームの作者が上記プラグインを適用してくれるとは限りません。現状、どのくらいの作者が上記プラグインを適用しているのかは不透明な状況です。上記対策が施されていないゲームを少しでも安全にプレーするためにプレイヤーが独自にできる対策はないか? そこで考えたのが「Canvasモードでゲームを実行する」ことです。まずは下の画像をご覧ください。

WebGLの実行結果

 まずWebGLモードで以下の条件でテストを行いました。遠景の指定された17×13のイベントが配置されていないマップで、メニューの開閉を繰り返して回数を記録していくというものです。実施環境はSurface Pro3(Win10 Pro) Core i5(GPU内蔵) メモリ4GBになります。すると回数を重ねるごとに使用量(コミット(KB))が増大し、400回ほど繰り返したところでなんの前触れもなくクラッシュしてしまいました。

Canvasの実行結果

 一方、こちらはCanvasモードでの実行結果です。画像が小さくて恐縮ですが、こちらは使用量は一定以上は増えることなくメニュー開閉を3000回繰り返しても安定していることが分かるかと思います。

 もちろん、この結果をもってCanvasモードにはメモリリークは存在しないと言い張るつもりはありません。実際、存在するのだけれどブラウザ(chromium)側でうまく処理してくれているのかもしれません。それでも、もしプレイヤーとして快適にプレーできないツクールMV作品に遭遇したときに、そこでプレーを諦めてしまうくらいなら試してみる価値くらいはあると思います。とはいえ、二つほど問題が残ります。

どうやってCanvasモードで実行するのか?

 これについては先日、たまたま知ることができました。

 Game.exeを右クリック→プロパティ→互換性から、「互換モードでこのプログラムを実行する」にチェックを入れ、Windows Vista(Service Pack2)を選択してから、実行するとCanvasモードで実行されるのです。互換モードでもWindows 7以降だとWebGLモードとなります。互換モード実行についてはメモリリーク問題とは別に恩恵があるようで、ある方のゲームが開始時に1000枚ほどのピクチャをキャッシュする仕様になっていて、通常の起動だと非常に時間が掛かるうえに動作も不安定になっていたものが、互換モード(Vista SP2)だと数秒で起動した、という事例がありました。これはいわゆるメモリブロートに近い問題ですね。(ただし、この件に関しては原因はよく分かっていません)

Canvasモードで実行することによるデメリットは何があるか?

 これも気になるところです。基本的にツクールMVはマルチプラットフォームを謳っており、かつモバイルでは基本的にCanvasモードで実行されます。つまり、少なくともプラグインを全く使用しない状態では二つのモードに傍目にも分かるような差異はないということです(もし差異があればマルチプラットフォームの前提が崩壊してしまうので)。もちろん現状ではブラウザやOSごとの細かい挙動の違いを完全に吸収できているとは言えない状況ですが、それはまた別問題でしょう。ですがプラグインを使う場合は話は別です。例えば、以下はPixi.jsのフィルタ機能を使ってタイトル画面を加工したものです。

 もともとはRTPのタイトル画像ですが、Pixi.jsのTwistFilterを適用することこんな動的演出が簡単にできてしまいます。フィルタは他にもこんなものがあります。

 これはInvertFilterを適用させたものです。いずれも既存のコードに数行追加するだけです。こんなフィルタがPixi.jsには複数用意されていますが、これらは全てWebGLモードでしか使用できません。Canvasモードでも異常終了したりはしませんが画像が変化しなくなります。もっとも、現状これらのフィルタを使用するようなMVのゲームはまだ出回っていないと思いますが……

まとめ

 RPGツクールMV製のゲームを長時間プレーし続けてパフォーマンスが低下してきたら、Windows Vista SP2の互換モードで実行すると快適になるかもしれない……というお話でした。

0 件のコメント:

コメントを投稿