Project1

标题: 关于Cache模块,是否需要手动释放? [打印本页]

作者: jhhuang    时间: 2017-7-16 11:57
标题: 关于Cache模块,是否需要手动释放?
本帖最后由 jhhuang 于 2017-7-25 22:09 编辑

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

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 绘制图标
  3.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  4.   #--------------------------------------------------------------------------
  5.   def draw_icon(icon_index, x, y, enabled = true)
  6.     bitmap = Cache.system("Iconset")
  7.     rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  8.     contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
  9.   end
  10.   #--------------------------------------------------------------------------
  11.   # ● 绘制角色肖像图
  12.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  13.   #--------------------------------------------------------------------------
  14.   def draw_face(face_name, face_index, x, y, enabled = true)
  15.     bitmap = Cache.face(face_name)
  16.     rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96)
  17.     contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
  18.     bitmap.dispose
  19.   end


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

那是不是代表,我们平时用Cache建立的所有图像,都没有必要释放?
作者: 喵呜喵5    时间: 2017-7-16 12:14
本帖最后由 喵呜喵5 于 2017-7-16 12:17 编辑

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

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

附上早先的讨论帖:
https://rpg.blue/forum.php?mod=v ... d=374690&extra=
作者: 张咚咚    时间: 2017-7-16 12:19
本帖最后由 张咚咚 于 2017-7-16 12:23 编辑

RUBY 代码复制
  1. module Cache
  2.   def self.first_load(path)
  3.     return unless path
  4.     @Cache = {} if @cache == nil
  5.     @cache[path] = Bitmap.new(path)
  6.   #rescue RGSSError
  7.      #msgbox "出现异常,释放所有图片可继续"
  8.      #Cache.clear
  9.    end
  10. end


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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1