Project1

标题: 通过Cache读取的Bitmap是否应该释放? [打印本页]

作者: 喵呜喵5    时间: 2014-12-22 11:36
标题: 通过Cache读取的Bitmap是否应该释放?
通过Cache读取的Bitmap应该是留在 @cache[path] 里面下次就直接使用的吧?那么这些Bitmap是否应该在用完后dispose呢?

以自带脚本为例,在Window_Base中这两个方法对于bitmap的处理就是不同的

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


究竟何时应该dispose那些Bitmap呢?
作者: taroxd    时间: 2014-12-22 12:39
本帖最后由 taroxd 于 2014-12-22 12:45 编辑

我更倾向于临时图像直接 Bitmap.new 而不是从缓存取出。缓存中取出来的还是不要 dispose 为好。

这里默认脚本处理方式不同的原因主要在于,Iconset 是整个游戏一直要用到的位图,而脸图不一定。但是这里就有一个问题。比如说你在某个功能中也要画脸图(HUD之类的)。

RUBY 代码复制
  1. class Sprite_HUD < Sprite
  2.  
  3.   def initialize(_)
  4.     super
  5.     self.bitmap = Cache.face('233')
  6.   end
  7.  
  8.   # ...
  9.  
  10. end


这时如果有个可恶的窗口在这里调用了 draw_face 然后把缓存中的位图释放掉的话…… 结果你懂的

曾经以为这不是什么大问题,然后 ULDS 偏偏就撞上了这个问题……

===

我的建议是,对于不需要缓存的位图,但是又想用 Cache.face(face_name) 而不想计算文件名的话,可以将这个 helper 定义为 Bitmap 类的类方法。

RUBY 代码复制
  1. class Bitmap
  2.  
  3.   def self.define_helper(sym)
  4.     path = "Graphics/#{sym.to_s.capitalize}/"
  5.     define_singleton_method sym do |filename|
  6.       new(path + filename)
  7.     end
  8.   end
  9.  
  10.   define_helper :face
  11.   define_helper :character
  12.   define_helper :battler
  13.   # ...
  14.  
  15. end
  16.  
  17. # ...
  18.  
  19. bitmap = Bitmap.face(face_name)

作者: 喵呜喵5    时间: 2014-12-23 13:53
taroxd 发表于 2014-12-22 12:39
我更倾向于临时图像直接 Bitmap.new 而不是从缓存取出。缓存中取出来的还是不要 dispose 为好。

这里默认 ...

我也被远景图的dispose坑过……

所以归根结底都是因为本身RGSS3就没有一个完整的dispose的规范么……


作者: taroxd    时间: 2014-12-23 17:16
本帖最后由 taroxd 于 2014-12-23 17:55 编辑
喵呜喵5 发表于 2014-12-23 13:53
我也被远景图的dispose坑过……

所以归根结底都是因为本身RGSS3就没有一个完整的dispose的规范么……


我的建议是,从 Cache 中取来的都不要 dispose

我现在正在写一个能自己管理位图释放的 Cache 类,不过感觉稍微有点多此一举的样子?(至少我自己是不会用的)
(现在在群组里名为 Temp 的帖子里。真的没时间啊……)

另外,按照默认脚本这个画脸的方式,如果每帧都要把脸重绘一次的话,只能说效率呵呵……




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