うわっ……私のRPGのメモリ、使いすぎ……?

 

お久しぶりですhirameです。

前回の投稿から2か月経ってしまいました。時間が過ぎるのは早いですね。

新作の進捗は微々たるものです。これからがっつり進めていきたいです。

 

さて、今回の内容は新作の話ではありません。

RPGツクールVX及びVX Aceで作成されたゲームのメモリの使用量についてです。

製作者向けの内容となっていますので、興味の無い方はあまり面白くない内容になります。

ADVのような要素を含んでいるゲームを制作している方が対象となります。

 

 

 

 

 

まずRGSS2と3(以降ツクール表記)の仕様の話から。

 

ツクールでは一度HDDから読み込まれた画像は、二度目以降の呼び出しに備え、表示速度の向上を行うためメモリ内に保存する処理(以降保存されたデータをキャッシュデータ表記)を行います。

スクリプト内で言うと、モジュールにあるCache項目に書かれてあるものがそれに該当します。

では二度と読み込まない古いキャッシュデータはどうなるのでしょうか? もちろん保存されたままです。

じゃあいつ削除されるのでしょうか?

 

 

 

削除されません。

 

 

 

正確には、F12キーを押しリセットした際には削除されます。

もちろんゲームを終了してウィンドウを閉じたら削除されます。

お気づきかもしれませんが、これがどういうことかというと画像を読めば読むほどメモリ使用量が増加していくというわけです。

 

 

それでは画像一枚を読むごとにどれくらいメモリを使用するのでしょうか?

読み込む画像のデータのサイズを思い浮かべるかもしれませんが、それは誤りです。

 

どういうことかと言いますと、pngを読み込んだものは一旦32bitビットマップファイルに変換され、それがメモリに保存されるのです。

つまり圧縮してあるものを解凍した状態で保存されるため、メモリ使用量はpngのデータサイズと比べかなり大きくなります。

 

解像度別に具体的な例を上げます。

544×416 → 約900KB

640×480 → 約1.22MB

このサイズが画像1枚読み込むごとにメモリ使用量として加算されていき、単純計算として、544x416の画像を100枚読み込むと90MB使用することになります。

詳しいサイズはphotoshopなどで32bitのビットマップファイルを保存してみれば分かるかと思います。

 

 

 

 

 

次に実際どれくらいメモリを使用しているのかなど。

 

上のほうで100枚読み込むことを例えてますが、実際そんなに読まなくね? と思われるかもしれません。

けどイベント画像+立ち絵で100枚は結構余裕で越えると思います。

レイディアスの場合でも小さい画像を除外すると300枚程度あります。大規模なゲームになると結構な枚数になるんじゃないでしょうか。

この枚数を1プレイ、つまり一度も終了せずに表示することがあるのかというと、普通にあるでしょう。回想や画像閲覧モードを付けているとなおさらです。

上記のようなデータ以外にもマップやモンスターの画像や、画像以外にもBGMなど様々なデータを読み込むみます。結果、知らず知らずのうちに結構なメモリ消費量になっている(かもしれない)というわけです。

レイディアスの場合ですと、テストで回想モードを実行し全回想を見たところ、392MB使用していることを確認しました。現在は処理を施しているのでそんなに使用しないはずです。

 

 

 

次、メモリを大量に消費することによる弊害に関して。

 

最近のPCはメモリが多いから気にしなくて良いんじゃないの? と思われるかもしれませんがそうでもありません。

理由としては下記の通り。

 

  • 作品紹介の推奨メモリに256MB以上と書いている
  • ユーザーは新しめのPCでゲームをプレイしているとは限らない
  • ツクールごときにこんな大量にメモリを消費するのが気に食わない
  • メモリを大量に消費することにより変なエラーが出る可能性がある

 

一つ目ですが、これ実際プレイして確認しといたほうが良いんじゃないかなと。もしくは512MBなど大目にするとか。

二つ目は、10年以上前のPCも想定すべきかなと。大抵WindowsXP対応って書かれてるでしょうし。

三つ目。単なるこだわりです。

四つ目。これが本題ですが、どうもメモリを大量に使用することによりツクールでエラーが発生するんじゃないかなと睨んでいます。

と言いますと、作業PCはメモリを24GB積んでいるのにもかかわらずキャッシュをメモリに保存する箇所でエラーが出ましたし、ユーザー様から同じような症状が起きたと申告がありました。

で、メモリ使用量を軽減する処理を修正を施したところ、そのような症状が起きたといったようなことはありませんし、申告もありません。

なのでRGSS側になにかそういう制限があるのかなと思ったり。まあ実は他に原因があったのかもしれません。

 

 

 

最後に対処方法。

 

全ての画像データをメモリに保存しなければ当然メモリの使用量は抑えられますが、処理速度に影響がでるかもしれません。

かと言ってキャッシュデータをずっと保存しておくのは、これまで書いてきた通りあまりよろしくないように思えます。

そんなわけで自分がとりあえず出した結論としては下記のようになりました。

 

  • 「ピクチャの表示」で表示した画像のデータ名をリスト化する
  • イベントの最後で、上記でリスト化してあるデータを対象に、キャッシュデータを削除する

 

「ピクチャの表示」で表示する画像は、あまり処理速度が必要としないデータであること。イベントが終了すると関連する画像の読み込みはあまり行わないことなどが理由に挙げられます。

で、実際スクリプト化してみました。下記リンクからVXのサンプルプロジェクトと、スクリプトのテキストが同梱されているファイルがダウンロードできます。

 

キャッシュ削除

 

これをタスクマネージャーなどメモリの動きが分かるアプリケーションを起動し、テストプレイを行ってみてください。

サンプルではVXのプロジェクトですが、VX Aceでも動作します(というかそちらがメイン)

プロジェクトの中身を見れば分かりますが、最終的な削除の処理自体は自動ではなく手動で行います。

イベントが終わったら自動的に削除しないん? などご意見あるかもしれませんが、どのタイミングで削除するのかは製作者の皆様に任せるという形にしました。というかそこまで考えるのが面倒だった。

 

 

 

 

 

以上長々と書いてきました。

ご意見ご感想等ありましたらコメント欄、もしくはTwitterでもお答えしますのでお気軽にどうぞ。


Posted in: RPGツクール, キャッシュ削除, スクリプト, 技術

Comments are closed.