じ☆ve冰风 发表于 2025-4-29 15:45:37

内存泄漏导致创建bitmap失败

报错日志:
LOG 代码
Script 'Cache' line 100: RGSSError occurred.

failed to create bitmap


报错代码:
RUBY 代码
# encoding: utf-8
#==============================================================================
# ■ Cache
#------------------------------------------------------------------------------
#  各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール
# です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部
# のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト
# を返すようになっています。
#==============================================================================

module Cache
#--------------------------------------------------------------------------
# ● アニメーション グラフィックの取得
#--------------------------------------------------------------------------
defself.animation(filename, hue)
    load_bitmap("Graphics/Animations/", filename, hue)
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)グラフィックの取得
#--------------------------------------------------------------------------
defself.battleback1(filename)
    load_bitmap("Graphics/Battlebacks1/", filename)
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)グラフィックの取得
#--------------------------------------------------------------------------
defself.battleback2(filename)
    load_bitmap("Graphics/Battlebacks2/", filename)
end
#--------------------------------------------------------------------------
# ● 戦闘グラフィックの取得
#--------------------------------------------------------------------------
defself.battler(filename, hue)
    load_bitmap("Graphics/Battlers/", filename, hue)
end
#--------------------------------------------------------------------------
# ● 歩行グラフィックの取得
#--------------------------------------------------------------------------
defself.character(filename)
    load_bitmap("Graphics/Characters/", filename)
end
#--------------------------------------------------------------------------
# ● 顔グラフィックの取得
#--------------------------------------------------------------------------
defself.face(filename)
    load_bitmap("Graphics/Faces/", filename)
end
#--------------------------------------------------------------------------
# ● 遠景グラフィックの取得
#--------------------------------------------------------------------------
defself.parallax(filename)
    load_bitmap("Graphics/Parallaxes/", filename)
end
#--------------------------------------------------------------------------
# ● ピクチャ グラフィックの取得
#--------------------------------------------------------------------------
defself.picture(filename)
    load_bitmap("Graphics/Pictures/", filename)
end
#--------------------------------------------------------------------------
# ● システム グラフィックの取得
#--------------------------------------------------------------------------
defself.system(filename)
    load_bitmap("Graphics/System/", filename)
end
#--------------------------------------------------------------------------
# ● タイルセット グラフィックの取得
#--------------------------------------------------------------------------
defself.tileset(filename)
    load_bitmap("Graphics/Tilesets/", filename)
end
#--------------------------------------------------------------------------
# ● タイトル(背景)グラフィックの取得
#--------------------------------------------------------------------------
defself.title1(filename)
    load_bitmap("Graphics/Titles1/", filename)
end
#--------------------------------------------------------------------------
# ● タイトル(枠)グラフィックの取得
#--------------------------------------------------------------------------
defself.title2(filename)
    load_bitmap("Graphics/Titles2/", filename)
end
#--------------------------------------------------------------------------
# ● ビットマップの読み込み
#--------------------------------------------------------------------------
defself.load_bitmap(folder_name, filename, hue = 0)
    @cache ||= {}
    if filename.empty?
      empty_bitmap
    elsif hue == 0
      normal_bitmap(folder_name + filename)
    else
      hue_changed_bitmap(folder_name + filename, hue)
    end
end
#--------------------------------------------------------------------------
# ● 空のビットマップを作成
#--------------------------------------------------------------------------
defself.empty_bitmap
    Bitmap.new(32, 32)# 报错代码
end
#--------------------------------------------------------------------------
# ● 通常のビットマップを作成/取得
#--------------------------------------------------------------------------
defself.normal_bitmap(path)
    @cache = Bitmap.new(path)unlessinclude?(path)
    @cache
end
#--------------------------------------------------------------------------
# ● 色相変化済みビットマップを作成/取得
#--------------------------------------------------------------------------
defself.hue_changed_bitmap(path, hue)
    key =
    unlessinclude?(key)
      @cache = normal_bitmap(path).clone
      @cache.hue_change(hue)
    end
    @cache
end
#--------------------------------------------------------------------------
# ● キャッシュ存在チェック
#--------------------------------------------------------------------------
defself.include?(key)
    @cache && !@cache.disposed?
end
#--------------------------------------------------------------------------
# ● キャッシュのクリア
#--------------------------------------------------------------------------
defself.clear
    @cache ||= {}
    @cache.clear
    GC.start
end
end


游戏总是没有缘由的闪退,用x32dbg下断点查了一下发现有一个没显示的弹窗,居然是无法创建bitmap
尝试复现时发现游戏在缓慢的增加最低内存占用,疑似跟内存泄漏有关
在网上查了一下基本都是因为加密打包,跟我的情况没关系
请问各位有什么解决方法吗,逆向rgss的伪代码看的头疼
            本帖来自P1论坛作者予纾2606,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=497327若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 内存泄漏导致创建bitmap失败