查看: 2588|回复: 3

[已经解决] 通过Cache读取的Bitmap是否应该释放?

[复制链接]

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

开拓者短篇九导演组冠军

发表于 2014-12-22 11:36:08 | 显示全部楼层 |阅读模式

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

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

×
通过Cache读取的Bitmap应该是留在 @cache[path] 里面下次就直接使用的吧?那么这些Bitmap是否应该在用完后dispose呢?

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

[pre lang="ruby" line="1"]  #--------------------------------------------------------------------------
  # ● 绘制图标
  #     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]

究竟何时应该dispose那些Bitmap呢?

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-12-22 12:39:29 | 显示全部楼层
本帖最后由 taroxd 于 2014-12-22 12:45 编辑

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

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

[pre lang="ruby" line="1"]
class Sprite_HUD < Sprite

  def initialize(_)
    super
    self.bitmap = Cache.face('233')
  end

  # ...
  
end[/pre]

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

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

===

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

[pre lang="ruby" line="1"]

class Bitmap

  def self.define_helper(sym)
    path = "Graphics/#{sym.to_s.capitalize}/"
    define_singleton_method sym do |filename|
      new(path + filename)
    end
  end

  define_helper :face
  define_helper :character
  define_helper :battler
  # ...

end

# ...

bitmap = Bitmap.face(face_name)[/pre]
回复

使用道具 举报

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

开拓者短篇九导演组冠军

 楼主| 发表于 2014-12-23 13:53:31 | 显示全部楼层
taroxd 发表于 2014-12-22 12:39
我更倾向于临时图像直接 Bitmap.new 而不是从缓存取出。缓存中取出来的还是不要 dispose 为好。

这里默认 ...

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

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

回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-12-23 17:16:37 | 显示全部楼层
本帖最后由 taroxd 于 2014-12-23 17:55 编辑
喵呜喵5 发表于 2014-12-23 13:53
我也被远景图的dispose坑过……

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


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

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

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部