Ace 【RGSS3】 表示した画像の消去について

aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

Ace 【RGSS3】 表示した画像の消去について

投稿記事by aiueo » 2022年8月09日(火) 18:01

Ace 【RGSS3】 表示した画像の消去について

RPGツクールVX Ace
RGSS3

画像を以下のように表示したとします
・画像ファイル test1.png、test2.pngを \ Graphics \ Pictures に用意
・スクリプトエディタにて
class Game_Interpreter
def gazou_hyouji #画像の表示################
$cache1 = Cache.picture(" test1 ") #キャッシュの作成
$cache2 = Cache.picture(" test2 ") #   〃
$sprite_all=[] #スプライト格納用の配列を作成
$sprite[0] = Sprite.new #スプライトの作成
$sprite[1] = Sprite.new #    〃
$sprite[0].bitmap = $cache1 #スプライトにキャッシュを表示
$sprite[1].bitmap = $cache2 #      〃
$sprite[0].z = $sprite[1].z = 1 #スプライトのZ値を指定
$sprite[1].x = 100 #スプライトのX座標を指定
end
end
・マップイベントのイベントコマンド「スクリプト」で
gazou_hyouji
・PCがイベントに話しかけて画像が表示される

■質問:1
この画像を消去する場合、同様な方法で
class Game_Interpreter
def gazou_kesu
$sprite[0].dispose #スプライトの解放
$sprite[1].dispose # 〃
end
end
というのをやっていたのですが、
Bitma.newとか書いてないので、
ビットマップの解放は書かなくていいと思ってましたが、
こうするべきなのでしょうか?
$sprite[0].bitmap.dispose #ビットマップの解放
$sprite[1].bitmap.dispose # 〃
$sprite[0].dispose #スプライトの解放
$sprite[1].dispose # 〃

■質問:2
上記の方法以外に、再度
$sprite_all=[]
とやると画像が消えますが、
きちんとビットマップやスプライトが解放されてるのでしょうか?

■質問:3
Graphics.updateを書いたことが無いのですが
(なくても何だか動いているので)
入れるべきなのでしょうか?

以上、よろしくお願いいたします。

アバター
CACAO
記事: 18
登録日時: 2016年9月12日(月) 14:46
連絡を取る:

Re: Ace 【RGSS3】 表示した画像の消去について

投稿記事by CACAO » 2022年8月09日(火) 22:12

質問1
Cache.xxx を使用して読み込んだ画像は Cache モジュールが保持するため必ずしも解放する必要はありません。
使用頻度の少ない画像であれば解放してしまっても良いのではないでしょうか?
キャッシュの目的としては、低速な読み込みを省くことによる高速化、同一画像の読み込みを行わないことによるメモリ節約となります。


質問2
$sprite_all は使用されていないので $sprite に読み替えて答えますが、
次にガベージコレクション(GC)が実行されるまでは表示されたままだと思います。
参照が切れれば GC によって、画像・スプライトともに解放されます。
ただし、不正終了の原因とされることもあるため参照を切る前に明示的に解放を行います。
今回は Cache.picture を使用しているため解放されるのはスプライトのみです。
画像を表示するためのスプライトが解放されることで画面上から消えます。
画像は Cache モジュールが保持しているため解放されません。


質問3
Graphics.update は画面更新とフレームを進める処理ですので必ず実行する必要があります。が、
Scene_Base#update_basic で実行されており、すべてのシーンクラスは Scene_Base を継承しています。
ゲーム中はいずれかのシーンが実行されているので、そこで定期的に呼び出されています。
そのため書く必要はありません。
aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

Re: Ace 【RGSS3】 表示した画像の消去について

投稿記事by aiueo » 2022年8月09日(火) 23:47

CACAO様ありがとうございます。

誤==>正
$sprite_all==>$sprite
Bitma.new==>Bitmap.new
間違えてました。すみません

■質問:1
Bitmap.newでビットマップオブジェクトを作成した場合は
$picture.bitmap.dispose
$picture.disposeのようにビットマップとスプライトをセットで開放するけれど、

キャッシュオブジェクトを作成した場合は(特にキャッシュを消さない場合は)
スプライトを開放する記述だけで良い、ということですね。

■質問:2
スプライトやキャッシュを格納する変数を連番で欲しくて配列内に格納し、
その表示を消すときスプライトの配列だけeach doで順番にdisposeしてたんですが、
試しに空の配列[]を代入すると即画像が消えました。
簡単ですが正規の手順を踏んでない(自分でdisposeしてない)のでどうかなと思いまして。
やはり自分でdisposeしたほうがトラブルが無くて良さそうですね。

■質問:3
スクリプト入門の例文みたいにシーンの外で実行する場合は自分で書くけれど
マップからなど普通にどこかのシーンである限り自分では書かなくていいわけですね。

CACAO様ありがとうございました!

“VX / Ace:質問” へ戻る