【解決済み】Scene_Boot.loadSystemImages の要領で、faces や pictures 内に新設したフォルダの画像をあらかじめ読み込むための記述方法を教えていただきたく・・・

アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

【解決済み】Scene_Boot.loadSystemImages の要領で、faces や pictures 内に新設したフォルダの画像をあらかじめ読み込むための記述方法を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年11月01日(水) 23:25

「ツクマテ」の皆様、お世話になっております。今回もどうぞよろしくお願いいたします。

Scene_Boot.loadSystemImages の要領で、顔グラやピクチャの一部をあらかじめ読み込んで
おきたいのですが、ただ rpg_scenes 内に・・・

Scene_Boot.loadFaceImages = function() {
ImageManager.reserveFace('Actor_01');
ImageManager.reserveFace('Actor_02');
ImageManager.reserveFace('Actor_03');
          ・
          ・
          ・
};

などと書き加えるだけでは効果はないようですね。そこで、システム画像のようにあらかじめ
ロードしておくことができるよう、正しい記述方法を教えていただきたいのです。

ちなみに、pictures 内に新設したフォルダには glossary とネーミングしており、System や
Face に倣って rpg_managers 内に・・・

ImageManager.loadGlossary = function(filename, hue) {
return this.loadBitmap('img/pictures/glossary/', filename, hue, true);
};

ImageManager.reserveGlossary = function(filename, hue, reservationId) {
return this.reserveBitmap('img/pictures/glossary/', filename, hue, true, reservationId);
};

ImageManager.requestGlossary = function(filename, hue) {
return this.requestBitmap('img/pictures/glossary/', filename, hue, true);
};

を追加済みです。ミスや不足がありましたら、また、少々数が多くなりそう(ファイルサイズは
あまり大きくはならない予定)なので、そちらの注意点などもあれば是非ご教授ください。

どうぞよろしくお願いいたします。
最後に編集したユーザー 蓮賀まさとき on 2023年11月03日(金) 18:33 [ 編集 1 回目 ]

・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: Scene_Boot.loadSystemImages の要領で、faces や pictures 内に新設したフォルダの画像をあらかじめ読み込むための記述方法を教えていただきたく・・・

投稿記事by Plasma Dark » 2023年11月02日(木) 04:42

まず、 rpg_XXXXX.js を直接編集することは推奨しません。
プラグインに記述しても同じように動作させられます。
独自の記述を行う場合はプラグインを作るようにすると管理しやすくなります。

さて、 ImageManager.reserveBitmap は、MVにおいては画像をロードしてキャッシュにのせるという挙動をします。
MVの画像キャッシュは少し複雑なつくりになっていて、まずはそこから読んで理解されると良いかと思います。

Scene_Boot.loadSystemImages の呼び出し元は DataManager.onLoad です。単に真似をするのであれば同じようにその辺りから呼んであげる必要があります。

コード: 全て選択

const _onLoad = DataManager.onLoad;
DataManager.onLoad = function (object) {
  _onLoad.call(this, object);
  if (object === $dataSystem) {
    Scene_Boot.loadFaceImages();
  }
};


MVの画像キャッシュはファイルサイズではなく、ピクセル数で上限が決まっています。
上限を越えてキャッシュにのせようとすると、アクセスされた日時が古い画像から順に、キャッシュから追い出されます。
reserveBitmapでキャッシュに載せられた画像は、少し複雑な仕様があり、 reservationId が有効な間は追い出しの対象外となります。
引数の reservationId を省略した場合は最後に設定されたデフォルトの reservationId が利用されますが、この場合はシーンが変わると追い出しの対象外にする効果がなくなります。
システム画像は特別な reservationId を使っていて、常にキャッシュからの追い出しの対象外になっています。

本当に、ゲーム起動直後の Scene_Boot の時点(あるいは、 DataManager.onLoad の時点)でキャッシュにのせたいのかどうかは検討しても良いと思います。
タイトルシーンでは顔グラは使われませんし、使うシーンのセットアップ時にロードして十分表示に間に合うのであれば、特に Scene_Boot の時点でキャッシュにのっている必要はありません。
Glossaryということは用語集かと思いますが、用語集シーンのセットアップ時にロードしておくだけでも十分だったりしないでしょうか。

reserveBitmapを使うべきかどうかも、ケース次第です。
どれだけの間、キャッシュに残り続けてほしいかどうか、という視点で検討してみてください。
- loadBitmap を呼ぶ (キャッシュにのるが、追い出しの対象になる)
- reserveBitmap を reservationId 指定なしで呼ぶ (シーン中は追い出しの対象にならない)
- reserveBitmap を reservationId 指定ありで呼ぶ (常に追い出しの対象にならない)

追い出しの対象にならない画像が増えると、それ以外の画像をのせられるスペースが減って、かえってパフォーマンスが劣化する可能性があることに注意してください。
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: Scene_Boot.loadSystemImages の要領で、faces や pictures 内に新設したフォルダの画像をあらかじめ読み込むための記述方法を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年11月02日(木) 20:48

Plasma Dark様

初めまして! ご教授に加えてプラグインのコードまで、ありがとうございます!
Plasma Dark さんが書きました:まず、 rpg_XXXXX.js を直接編集することは推奨しません。
プラグインに記述しても同じように動作させられます。
独自の記述を行う場合はプラグインを作るようにすると管理しやすくなります。

すみません。そうだと分かってはいるのですが、まだプラグインとして独立したモノを作るまでには
至らず、お恥ずかしい限りです(苦笑。ただ、近いうちに rpg_windows 内の自作ウィンドウを切り
離す・・・くらいは試してみたいと思っています)。

おぉ、画像のキャッシュはそのような仕組みになっていたのですね。とりあえず・・・

 ・MVの画像キャッシュは「ピクセル数」で上限がある。
 ・上限を超えると、アクセス日時の古い画像から追い出される。
 ・システム画像は特別な reservationId が使用され、常にキャッシュからの追い出し対象外。
 ・追い出し対象にならない画像が増えると、パフォーマンス劣化の可能性がある。

と言うことは分かりました。特に顔グラは出来るだけ使い回せるよう工夫するなどし、むやみに
ピクセル数を増やさないことを心掛けたいと思います。

Plasma Dark さんが書きました:本当に、ゲーム起動直後の Scene_Boot の時点(あるいは、 DataManager.onLoad の時点)でキャッシュにのせたいのかどうかは検討しても良いと思います。
タイトルシーンでは顔グラは使われませんし、使うシーンのセットアップ時にロードして十分表示に間に合うのであれば、特に Scene_Boot の時点でキャッシュにのっている必要はありません。
Glossaryということは用語集かと思いますが、用語集シーンのセットアップ時にロードしておくだけでも十分だったりしないでしょうか。

はい、仰る通りです。Glossary はトリアコンタン様からお借りしている「ゲーム内用語辞典プラグイン」
で表示する画像専用のフォルダで、可能であれば「辞典を起動する際にロード」&「閉じる際に追い出し」
で十分なのですが、自力ではどうすれば良いか分からず、まずは Scene_Boot で読み込み、辞典起動時
でも有効かどうか? を確かめてみたい・・・と思った次第です。

ちなみに今回の質問は、「用語辞典」における以下の様な現象の解消が目的です。

 ・顔グラはフレーム用の画像を上位に表示する形を取っているが、現在のパーティーにいないなどの
  アクターの場合、顔グラの方が上位に表示(新規読み込み時の遅延?)されてしまう。
 ・Glossary 内のピクチャでも、ページを切換えた際に新しい画像が配置されていると、ページ全体が
  一瞬消えてチラつく(これも遅延が原因??)。

一度表示されてしまえばいくらページを切換えてもこのような現象は起こらないため、事前に読み込みが
出来れば解消は可能なのでは? と思い、あれこれ探ってみた・・・と言うワケです。

それでは、本日はこれにて失礼します。頂いたコードは、後ほど実際にプラグインとしてインポートして
みてたいと思います。
貴重なお時間を割いてくださってのご教授、本当にありがとうございました(何か・・・投稿時刻がスゴ
すぎるんですが・・・)! 感謝です!!

※トリアコンタン様の「ゲーム内用語辞典プラグイン」はこちら!
 https://raw.githubusercontent.com/triacontane/RPGMakerMV/master/SceneGlossary.js
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: Scene_Boot.loadSystemImages の要領で、faces や pictures 内に新設したフォルダの画像をあらかじめ読み込むための記述方法を教えていただきたく・・・

投稿記事by Plasma Dark » 2023年11月02日(木) 22:24

可能であれば「辞典を起動する際にロード」&「閉じる際に追い出し」
で十分なのですが、自力ではどうすれば良いか分からず


少しだけ複雑な部分について補足させていただくと、 reservationId を省略して reserveBitmap を呼んだ場合でも、シーン終了時にキャッシュから追い出されるわけではありません。
あくまで、追い出しの対象外にならなくなるだけで、キャッシュが溢れて追い出しが発生しない限りキャッシュ上に残りはします。

 ・顔グラはフレーム用の画像を上位に表示する形を取っているが、現在のパーティーにいないなどの
  アクターの場合、顔グラの方が上位に表示(新規読み込み時の遅延?)されてしまう。
 ・Glossary 内のピクチャでも、ページを切換えた際に新しい画像が配置されていると、ページ全体が
  一瞬消えてチラつく(これも遅延が原因??)。

一度表示されてしまえばいくらページを切換えてもこのような現象は起こらないため、事前に読み込みが
出来れば解消は可能なのでは?


後者については、仰るとおり事前にロードしておけば解消できそうですね。
前者は、画像の表示順が変わるということでしょうか……。なんとなく奇妙な気もしますが、事前のロードを試してみる価値はあると思います。

さて、用語集シーンのセットアップ時に必要な画像をロードしてキャッシュにのせるプラグインの例を書いてみました。

追い出しの対象外にまでしなくても、画像の総ピクセル数次第ではキャッシュにすべてのってくれるので、 loadBitmap を使用しています。
必要に応じて、 loadGlossary, loadFace などを使っていただけると良いかと思います。


最後に、余談ですが、リリースされる媒体に応じてMVの画像キャッシュ上限のピクセル数をチューニングしたほうがユーザー体験が良くなる、という話もあるようです。

ツクールMV製ゲームの軽量化を頑張ったまとめ - はら

RPGツクールMVの動作軽量化対策について - ふらいんぐパンジャンドラム 別館
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: Scene_Boot.loadSystemImages の要領で、faces や pictures 内に新設したフォルダの画像をあらかじめ読み込むための記述方法を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年11月03日(金) 18:32

Plasma Dark様

あぁ、用語集シーン用のプラグインまで組んでくださってありがとうございます!!
最初に頂いたコードもそうでしたが、まず意外とシンプルなのにビックリ! にも拘らず、キッチリ
不具合を解消してくれて、もう感動です!!
これでフレームと顔グラのプライオリティの逆転と、ページ切り替え時のチラつきも無くなりました。
きっとプレイヤーさんにも、ストレスなく辞典を鑑賞していただけることと思います♪

頂いたプラグインは GlossaryPreloadlmages.js として登録しました。大切に使わせていただきますね!

Plasma Dark さんが書きました:前者は、画像の表示順が変わるということでしょうか……。なんとなく奇妙な気もしますが、事前のロードを試してみる価値はあると思います。

はい。私も理屈は良く分かりませんが、フレームは辞典の機能である「追加ピクチャ」で、顔グラ表示の
指示はそれ以前に記述・・・と言うカタチになっていますので、通常であれば顔グラが下位になるはず
なんですけどね。でも、万事解決! 嬉しい限りです。

Plasma Dark さんが書きました:最後に、余談ですが、リリースされる媒体に応じてMVの画像キャッシュ上限のピクセル数をチューニングしたほうがユーザー体験が良くなる、という話もあるようです。

さらなるアドバイス、痛み入ります。キャッシュ上限のピクセル数って、チューニングも可能なんですね。
教えていただいた 2サイトにも後で行ってみようと思います。
ちなみにリリースはオーソドックスな圧縮ファイルのDL &解凍で PCプレイのみとなる予定です。いつ
完成するかは自分でも全く分かりませんが、これでまた一歩前進することが出来ました!

と言うワケで、本件はこれにて【解決済み】といたします。お時間を割いてご教授&プラグインを提供
してくださった Plasma Dark様、本当にありがとうございました!!
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。

“MV:質問” へ戻る