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

Project1

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

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

[复制链接]

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21589
在线时间
9407 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

跳转到指定楼层
1
发表于 2014-12-22 11:36:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
通过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呢?

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2014-12-22 12:39:29 | 只看该作者
本帖最后由 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)
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21589
在线时间
9407 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

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

这里默认 ...

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

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

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 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 的帖子里。真的没时间啊……)

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-6 12:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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