Skip to content

Instantly share code, notes, and snippets.

@cacao-soft
Last active August 25, 2022 23:52
Show Gist options
  • Save cacao-soft/475050eb0e45dd7c043fa1dbbc06bdf3 to your computer and use it in GitHub Desktop.
Save cacao-soft/475050eb0e45dd7c043fa1dbbc06bdf3 to your computer and use it in GitHub Desktop.
RGSS3 スクリプト 'Cache' の 106 行目で RGSSError が発生しました。
# バックトレース情報を追加
module Cache
def self.normal_bitmap(path)
@cache[path] = Bitmap.new(path) unless include?(path)
rescue RGSSError => e
e.message << "\n\nPath: #{path.inspect}\n\n" << caller[2,5].map do |s|
s.gsub(/^{(\d+)}/) { "{#{$1}:#{$RGSS_SCRIPTS[$1.to_i][1]}}" }
end.join("\n")
raise
else
@cache[path]
end
end
# ファイルからのビットマップ生成に失敗した場合、キャッシュクリアを実行し再試行する
# それでも失敗する場合、再起動を促すメッセージを表示し透明な代替画像を使用する
module Cache
def self.normal_bitmap(path)
@cache[path] = try_load(path) unless include?(path)
@cache[path]
rescue RGSSError
@__errors ||= {}
unless @__errors[path]
msgbox(
"ビットマップの生成に失敗しました\n",
"ゲームを再起動してください\n\n",
"Path: #{path.inspect}\n\n",
caller[2,5].join("\n")
)
@__errors[path] = true
end
@cache[path] = empty_bitmap
end
def self.try_load(path)
Bitmap.new(path)
rescue RGSSError
clear # 使用中の画像解放防止のためGCに任せる
Bitmap.new(path)
end
end
# エラー情報を表示して処理を続行
# ゲームを再起動するまで透明な画像が使用される
# アニメーションなどはキャッシュされないため使う度にエラー表示されます
module Cache
def self.normal_bitmap(path)
@cache[path] = Bitmap.new(path) unless include?(path)
rescue RGSSError
msgbox "ビットマップの生成に失敗しました\n\n",
"Path: #{path.inspect}\n\n", caller[2,5].join("\n")
@cache[path] = empty_bitmap
else
@cache[path]
end
end
# エラー情報を表示して処理を続行
# ゲームを再起動するまで透明な画像が使用される
# エラーを表示したかを保持しエラーは一度だけ表示する
module Cache
def self.normal_bitmap(path)
@cache[path] = Bitmap.new(path) unless include?(path)
rescue RGSSError
@__errors ||= {}
unless @__errors[path]
msgbox "ビットマップの生成に失敗しました\n\n",
"Path: #{path.inspect}\n\n", caller[2,5].join("\n")
@__errors[path] = true
end
@cache[path] = empty_bitmap
else
@cache[path]
end
end
@cacao-soft
Copy link
Author

cacao-soft commented Aug 7, 2022

スクリプト 'Cache' の 106 行目で RGSSError が発生しました。
failed to create bitmap

  • ビットマップの生成に失敗したときに発生する。
  • 画像が見つからない場合は別の例外が発生する。
  • ファイルは存在するが破損している場合に発生する。
  • 画像ファイルでは無いときに発生する。拡張子省略に注意。
  • キャッシュしすぎの場合に発生する。私の環境ではメモリ使用量が1.6GB超えたあたりで発生した。
  • VX はitmap.new(width, height)で大きいサイズを指定した時にも発生した。
  • 暗号化の影響で失敗することがあるらしい。

cache_error.rb

  • エラー表示に画像パスとバックトレース情報を追加する
  • SS2208070106620

ignore_cache_error.rb

  • エラー情報を表示して透明な画像を生成する
  • ゲームを再起動するまで透明な画像が使用される
  • キャッシュが行なわれない画像の場合、毎回エラー表示される
  • SS2208070106710

ignore_cache_error2.rb

  • エラー情報を表示して透明な画像を生成する
  • ゲームを再起動するまで透明な画像が使用される
  • エラーを表示したかを保持しエラーは一度だけ表示する

@cacao-soft
Copy link
Author

cacao-soft commented Aug 7, 2022

暗号化した状態ですべての画像が読み込めるかテストしてみても良いかも

unless File.exist?("Game.rgss3a")
  File.open("list.txt", "w") do |f|
    f.puts Dir.glob("Graphics/**/*.*[gfp]")
  end
end

sp = Sprite.new
File.readlines("list.txt").each do |path|
  path.chomp!
  puts path
  sp.bitmap = Bitmap.new(path)
  Graphics.update
  sp.bitmap.dispose
end
sp.dispose
puts "Complete"

Graphics フォルダにテキストが含まれることがあるから txt を含めないようにした

暗号化した状態でコンソール表示するにはGame.exe consoleとすれば良い。
ショートカット作ってリンク先にconsole加えても良い。
SS2208070106845

@cacao-soft
Copy link
Author

cacao-soft commented Aug 25, 2022

いろいろ作ったけどcache_error_fixを入れておけば大丈夫だと思う。

テストコード

Dir.glob("Graphics/**/*.*") do |path|
  puts path
  Cache.normal_bitmap(path)
end

この4K画像を50個くらいにコピーして実行してみるとエラー出ると思う。
テキストファイルも入れて実行するとエラーメッセージが表示されるはず。

どちらのエラーが発生してもcache_error_fixを導入していれば、ゲームプレイは続行できるはず。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment