设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 120|回复: 1
打印 上一主题 下一主题

[有事请教] 内存泄漏导致创建bitmap失败

[复制链接]

Lv1.梦旅人

梦石
0
星屑
40
在线时间
3 小时
注册时间
2025-4-28
帖子
1
跳转到指定楼层
1
发表于 2025-4-29 16:03:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
报错日志:
LOG 代码复制
  1. Script 'Cache' line 100: RGSSError occurred.
  2.  
  3. failed to create bitmap


报错代码:
RUBY 代码复制
  1. # encoding: utf-8
  2. #==============================================================================
  3. # ■ Cache
  4. #------------------------------------------------------------------------------
  5. #  各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール
  6. # です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部
  7. # のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト
  8. # を返すようになっています。
  9. #==============================================================================
  10.  
  11. module Cache
  12.   #--------------------------------------------------------------------------
  13.   # ● アニメーション グラフィックの取得
  14.   #--------------------------------------------------------------------------
  15.   def self.animation(filename, hue)
  16.     load_bitmap("Graphics/Animations/", filename, hue)
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 戦闘背景(床)グラフィックの取得
  20.   #--------------------------------------------------------------------------
  21.   def self.battleback1(filename)
  22.     load_bitmap("Graphics/Battlebacks1/", filename)
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 戦闘背景(壁)グラフィックの取得
  26.   #--------------------------------------------------------------------------
  27.   def self.battleback2(filename)
  28.     load_bitmap("Graphics/Battlebacks2/", filename)
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 戦闘グラフィックの取得
  32.   #--------------------------------------------------------------------------
  33.   def self.battler(filename, hue)
  34.     load_bitmap("Graphics/Battlers/", filename, hue)
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 歩行グラフィックの取得
  38.   #--------------------------------------------------------------------------
  39.   def self.character(filename)
  40.     load_bitmap("Graphics/Characters/", filename)
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● 顔グラフィックの取得
  44.   #--------------------------------------------------------------------------
  45.   def self.face(filename)
  46.     load_bitmap("Graphics/Faces/", filename)
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● 遠景グラフィックの取得
  50.   #--------------------------------------------------------------------------
  51.   def self.parallax(filename)
  52.     load_bitmap("Graphics/Parallaxes/", filename)
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● ピクチャ グラフィックの取得
  56.   #--------------------------------------------------------------------------
  57.   def self.picture(filename)
  58.     load_bitmap("Graphics/Pictures/", filename)
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● システム グラフィックの取得
  62.   #--------------------------------------------------------------------------
  63.   def self.system(filename)
  64.     load_bitmap("Graphics/System/", filename)
  65.   end
  66.   #--------------------------------------------------------------------------
  67.   # ● タイルセット グラフィックの取得
  68.   #--------------------------------------------------------------------------
  69.   def self.tileset(filename)
  70.     load_bitmap("Graphics/Tilesets/", filename)
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● タイトル(背景)グラフィックの取得
  74.   #--------------------------------------------------------------------------
  75.   def self.title1(filename)
  76.     load_bitmap("Graphics/Titles1/", filename)
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● タイトル(枠)グラフィックの取得
  80.   #--------------------------------------------------------------------------
  81.   def self.title2(filename)
  82.     load_bitmap("Graphics/Titles2/", filename)
  83.   end
  84.   #--------------------------------------------------------------------------
  85.   # ● ビットマップの読み込み
  86.   #--------------------------------------------------------------------------
  87.   def self.load_bitmap(folder_name, filename, hue = 0)
  88.     @cache ||= {}
  89.     if filename.empty?
  90.       empty_bitmap
  91.     elsif hue == 0
  92.       normal_bitmap(folder_name + filename)
  93.     else
  94.       hue_changed_bitmap(folder_name + filename, hue)
  95.     end
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 空のビットマップを作成
  99.   #--------------------------------------------------------------------------
  100.   def self.empty_bitmap
  101.     Bitmap.new(32, 32) # 报错代码
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 通常のビットマップを作成/取得
  105.   #--------------------------------------------------------------------------
  106.   def self.normal_bitmap(path)
  107.     @cache[path] = Bitmap.new(path) unless include?(path)
  108.     @cache[path]
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● 色相変化済みビットマップを作成/取得
  112.   #--------------------------------------------------------------------------
  113.   def self.hue_changed_bitmap(path, hue)
  114.     key = [path, hue]
  115.     unless include?(key)
  116.       @cache[key] = normal_bitmap(path).clone
  117.       @cache[key].hue_change(hue)
  118.     end
  119.     @cache[key]
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● キャッシュ存在チェック
  123.   #--------------------------------------------------------------------------
  124.   def self.include?(key)
  125.     @cache[key] && !@cache[key].disposed?
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● キャッシュのクリア
  129.   #--------------------------------------------------------------------------
  130.   def self.clear
  131.     @cache ||= {}
  132.     @cache.clear
  133.     GC.start
  134.   end
  135. end


游戏总是没有缘由的闪退,用x32dbg下断点查了一下发现有一个没显示的弹窗,居然是无法创建bitmap
尝试复现时发现游戏在缓慢的增加最低内存占用,疑似跟内存泄漏有关
在网上查了一下基本都是因为加密打包,跟我的情况没关系
请问各位有什么解决方法吗,逆向rgss的伪代码看的头疼

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21832
在线时间
9434 小时
注册时间
2012-6-19
帖子
7120

开拓者短篇九导演组冠军

2
发表于 2025-4-30 00:49:11 | 只看该作者
cache 模块会缓存读取过的bitmap,下次再读取bitmap的时候就会直接读已缓存的内容,默认RGSS代码并没有清理缓存的逻辑,因此如果你的游戏图片资源很多并且一直在读取新图片的话,内存占用是会越来越大的
如果你确认是这个问题,那解决方法就是手动清一下cache的清理就好了,比如类似过章节或者过loading的时候,把确认没用到的cache 里的bitamp释放一下

但是也可能是除此以外其他脚本的内存泄露,基本上要么是bitmap没释放要么是sprite没释放
你可以拿这个查一下 https://rpg.blue/thread-369217-1-1.html

还有一种情况是某个脚本自己内部构建了一套缓存系统,印象最深刻的是之前我查过一个爆内存的情况,最后排查下来发现是一个文字渐变脚本的问题,因为绘制渐变文字是有消耗的,所以原始脚本绘制了渐变文字后会缓存结果,下次用到同一个文字时直接拿之前的绘制结果出来,问题是那个脚本作者是个英文使用者,英文就26个字母建个缓存没问题,结果到了中文环境直接测试不会爆,反复跑相同的内容不会爆,正常玩游戏2个小时总文字数量达到一定数量之后内存就爆了,和个定时炸弹一样的
这种就只能挨个脚本挨个分析了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-5-10 03:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表