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

Project1

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

[已经解决] 关于dispose, clear, empty

[复制链接]

Lv1.梦旅人

梦石
0
星屑
49
在线时间
157 小时
注册时间
2013-8-14
帖子
203
跳转到指定楼层
1
发表于 2013-8-24 11:29:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我想分清
dispose
clear
empty
之间的区别


举例 :
Scene_Title
RUBY 代码复制
  1. # 释放命令窗口
  2.     @command_window.dispose
  3.     # 释放标题图形
  4.     @sprite.bitmap.dispose
  5.     @sprite.dispose


Sprite_Timer
RUBY 代码复制
  1. # 清除窗口内容
  2.       self.bitmap.clear


Window_Selectable
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 更新光标举行
  3.   #--------------------------------------------------------------------------
  4.   def update_cursor_rect
  5.     # 光标位置不满 0 的情况下
  6.     if [url=home.php?mod=space&uid=370741]@Index[/url] < 0
  7.       self.cursor_rect.empty
  8.       return
  9.     end

主要还是empty 不知是清空内容(文字、颜色等)还是删除整个Rect
clear和dispose也一样是删还是清?



Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
2
发表于 2013-8-24 11:39:21 | 只看该作者
clear是Bitmap的方法,清空位图信息,效果大概就是把Bitmap每一个像素点换成透明的
dispose是在内存中释放掉,Sprite,Bitmap,Viewport等都有这个方法,dispose以后将会禁止所有对他的操作
empty翻了半天F1怎么都找不着 Rect有定义这个方法吗?不过兰触测试了一下 是把Rect的四个属性清零

点评

"dispose是在内存中释放掉"吗? 不过我测试的结果有值啊= =。请看5楼  发表于 2013-8-24 13:54
我也是到处找不到empty的说明= =  发表于 2013-8-24 13:47
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
560
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
3
发表于 2013-8-24 11:39:51 | 只看该作者
clear/dispose可以看http://rpg.blue/thread-327967-1-1.html,VA与XP一样
empty只是将Rect设为“空”,应该是设为(0,0,0,0)之类的
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2749
在线时间
2630 小时
注册时间
2013-1-16
帖子
5657

贵宾

4
发表于 2013-8-24 12:34:43 | 只看该作者
x.dispose 相当于 x=nil
clear 就是清除位图信息,但不会使实例为空.这个方法多用于Windwo和Bitmap中
empty好象只适用于Rect中,使其x,y,width,height为0

点评

empty只用于Rect啊...  发表于 2013-8-24 13:48
(Created by @喵kano)


施工现场:hotege.github.io
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
157 小时
注册时间
2013-8-14
帖子
203
5
 楼主| 发表于 2013-8-24 13:51:10 | 只看该作者
本帖最后由 九靈 于 2013-8-24 13:57 编辑
myownroc 发表于 2013-8-24 12:34
x.dispose 相当于 x=nil
clear 就是清除位图信息,但不会使实例为空.这个方法多用于Windwo和Bitmap中
empty ...


你说 "x.dispose 相当于 x=nil"
但是我在Scene_Title 中插入一句
  1.   #--------------------------------------------------------------------------
  2.   # ● 住处理
  3.   #--------------------------------------------------------------------------
  4.   def main
  5.     # 战斗测试的情况下
  6.     if $BTEST
  7.       battle_test
  8.       return
  9.     end
  10.     # 载入数据库
  11.     $data_actors        = load_data("Data/Actors.rxdata")
  12.     $data_classes       = load_data("Data/Classes.rxdata")
  13.     $data_skills        = load_data("Data/Skills.rxdata")
  14.     $data_items         = load_data("Data/Items.rxdata")
  15.     $data_weapons       = load_data("Data/Weapons.rxdata")
  16.     $data_armors        = load_data("Data/Armors.rxdata")
  17.     $data_enemies       = load_data("Data/Enemies.rxdata")
  18.     $data_troops        = load_data("Data/Troops.rxdata")
  19.     $data_states        = load_data("Data/States.rxdata")
  20.     $data_animations    = load_data("Data/Animations.rxdata")
  21.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  22.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  23.     $data_system        = load_data("Data/System.rxdata")
  24.     # 生成系统对像
  25.     $game_system = Game_System.new
  26.     # 生成标题图形
  27.     @sprite=Sprite.new
  28.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
  29.     # 生成命令窗口
  30.     s1 = "新游戏"
  31.     s2 = "继续"
  32.     s3 = "退出"
  33.     @command_window = Window_Command.new(192, [s1, s2, s3])
  34.     @command_window.back_opacity = 160
  35.     @command_window.x = 320 - @command_window.width / 2
  36.     @command_window.y = 288
  37.     # 判定继续的有效性
  38.     # 存档文件一个也不存在的时候也调查
  39.     # 有効为 @continue_enabled 为 true、無効为 false
  40.     @continue_enabled = false
  41.     for i in 0..3
  42.       if FileTest.exist?("Save#{i+1}.rxdata")
  43.         @continue_enabled = true
  44.       end
  45.     end
  46.     # 继续为有效的情况下、光标停止在继续上
  47.     # 无效的情况下、继续的文字显示为灰色
  48.     if @continue_enabled
  49.       @command_window.index = 1
  50.     else
  51.       @command_window.disable_item(1)
  52.     end
  53.     # 演奏标题 BGM
  54.     $game_system.bgm_play($data_system.title_bgm)
  55.     # 停止演奏 ME、BGS
  56.     Audio.me_stop
  57.     Audio.bgs_stop
  58.     # 执行过渡
  59.     Graphics.transition
  60.     # 主循环
  61.     loop do
  62.       # 刷新游戏画面
  63.       Graphics.update
  64.       # 刷新输入信息
  65.       Input.update
  66.       # 刷新画面
  67.       update
  68.       # 如果画面被切换就中断循环
  69.       if $scene != self
  70.         break
  71.       end
  72.     end
  73.     # 装备过渡
  74.     Graphics.freeze
  75.     # 释放命令窗口
  76.     @command_window.dispose
  77.     # 释放标题图形
  78.     @sprite.bitmap.dispose
  79.     @sprite.dispose
  80.      print @sprite    #===========>>>请看这边!请看这边!
  81.   end
复制代码
结果

这是依然占着内存的意思吧?



点评

...呃,这我就不太清楚了  发表于 2013-8-24 14:06
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

6
发表于 2013-8-24 14:06:51 | 只看该作者
我在所有脚本开头写了个
p @sprite ,结果是nil,这时候还没有赋值
Title中是先将@sprite赋值为“显示图片”然后用bitmap方法显示图片的,这时候已经附了一个随机值。
所以当@sprite.dispose掉之后再p @sprite就会放出那个随机值(好像是16进制的)。
而脚本中使用@sprite = nil功能和.dispose是一样的,不同的是前者直接将@sprite清空,后者只是关掉它。

评分

参与人数 1星屑 +90 收起 理由
︶ㄣ牛排ぶ + 90 认可答案

查看全部评分


  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
7
发表于 2013-8-24 14:16:48 | 只看该作者
我表示谁说@sprite=nil 和@sprite.dispose功能一样了……= =
@sprite在dispose以后 是他的C++部分在内存中去掉了 他在Ruby的这部分还需要你清除 也就是@sprite=nil
但是直接@sprite=nil Ruby部分清除了 但是C++部分没有清除 还需要GC什么的清理一遍

评分

参与人数 1星屑 +90 收起 理由
︶ㄣ牛排ぶ + 90 认可答案

查看全部评分

我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
157 小时
注册时间
2013-8-14
帖子
203
8
 楼主| 发表于 2013-8-24 14:37:59 | 只看该作者
本帖最后由 九靈 于 2013-8-24 14:39 编辑
kuerlulu 发表于 2013-8-24 14:06
我在所有脚本开头写了个
p @sprite ,结果是nil,这时候还没有赋值
Title中是先将@sprite赋值为“显示图片 ...


综合以上,即
@sprite.dispose 时在内存中被去掉(释放内存),但是
@sprite 本身有个值是还存在于内存中的地址(那个16进制的:0x***)
所以如果
@sprite.dispose后print @sprite 输出的是那个内存地址(好像是放图的地址)但是实际上已经被释放掉了 而
@sprite=nil 就是把那个内存地址清除

至此理解对吧...

点评

这个理解是对的,另外我说LS你在哪里学的= =GC是把没有句柄的对象回收掉= =和nil什么dispose什么的都没关系好吗= =  发表于 2013-8-24 14:54
顺便附GC方法(很简单):GC.enable (允许垃圾回收)[隔一行]GC.start (开始回收垃圾),这样能把所有dispose掉的东西变成nil  发表于 2013-8-24 14:43
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 09:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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