查看: 2294|回复: 4

[交流讨论] 关于Cache模块,是否需要手动释放?

[复制链接]
梦石
0
星屑
253
在线时间
574 小时
注册时间
2006-8-25
回帖
772
发表于 2017-7-16 11:57:49 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 jhhuang 于 2017-7-25 22:09 编辑

今天在看Window_Base类时发现一个奇葩的问题。脚本如下:

[pre lang="ruby"]
  #--------------------------------------------------------------------------
  # ● 绘制图标
  #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  #--------------------------------------------------------------------------
  def draw_icon(icon_index, x, y, enabled = true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
  end
  #--------------------------------------------------------------------------
  # ● 绘制角色肖像图
  #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  #--------------------------------------------------------------------------
  def draw_face(face_name, face_index, x, y, enabled = true)
    bitmap = Cache.face(face_name)
    rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96)
    contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
    bitmap.dispose
  end[/pre]

默认脚本在绘制角色肖像图,描绘完毕后会释放bitmap。但是在绘制图标时,却不释放。

那是不是代表,我们平时用Cache建立的所有图像,都没有必要释放?

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2017-7-16 12:14:52 | 显示全部楼层
本帖最后由 喵呜喵5 于 2017-7-16 12:17 编辑

感觉到卡顿影响性能时才释放

我一直觉得描绘脸图后释放bitmap是rgss3不同人合作写代码写出的bug……

附上早先的讨论帖:
https://rpg.blue/forum.php?mod=v ... d=374690&extra=

点评

M5大大晚安,我好像也遇到同样问题了...https://rpg.blue/thread-483161-1-1.html...请问是不是把Window_Base的def draw_face(...)中,那句bitmap.dispose注释掉就行了??  发表于 2020-9-3 18:03

评分

参与人数 1星屑 +60 收起 理由
jhhuang + 60 孔子你好,孔子再见。

查看全部评分

回复

使用道具 举报

梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2017-7-16 12:19:21 | 显示全部楼层
本帖最后由 张咚咚 于 2017-7-16 12:23 编辑

[pre lang="ruby"]module Cache
  def self.first_load(path)
    return unless path
    @Cache = {} if @cache == nil
    @cache[path] = Bitmap.new(path)
  #rescue RGSSError
     #msgbox "出现异常,释放所有图片可继续"
     #Cache.clear
   end
end[/pre]

我刚试了一下,读取一个图片10万次,会发现抛出一个异常
我觉得应该是内存满了什么的,一般情况下是占不满的我觉得,如果图片量过大
可以把那三行注释去掉,发现异常后自动释放所有图片
0.upto(100000){|i|
Cache.first_load("Graphics/Pictures/filename")
}

点评

一般情况下占不满,但偶尔会出现极端情况,比如某个外国人写的文字渐变脚本会把文字渐变bitmap保存到缓存中,用到中文游戏里字多时会崩……  发表于 2017-7-16 13:48

评分

参与人数 1星屑 +60 收起 理由
jhhuang + 60 问题已解答,谢谢各位。

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部