Project1

标题: 关于refresh的用法… [打印本页]

作者: 喵呜喵5    时间: 2013-9-23 22:12
标题: 关于refresh的用法…
本帖最后由 喵呜喵5 于 2013-9-25 09:28 编辑

看到脚本教程中说refresh要调用大量资源所以原则上是需要时才refresh,那么这个refresh方法和其他方法相比有特殊的地方吗?我用其他方法而不用refresh会有区别吗?
另外,哪些命令应该由refresh处理呢?还是直接无脑的把只需执行一次的命令全扔refresh里就好了?
作者: a774741359    时间: 2013-9-23 23:12
refresh无非就是一个方法,你调用它或者不调用它,它都在那里。
教程中说的是一个需要调用大量资源的方法并不是特指名字叫做refresh的。
refresh一般用来处理图像,可以理解为重画。这也是和update的区别。
举个栗子{:2_257:}
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Help
  4. #------------------------------------------------------------------------------
  5. #  显示特技和物品等的说明、以及角色状态的窗口
  6. #==============================================================================

  7. class Window_Help < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   def initialize(line_number = 2)
  12.     super(0, 0, Graphics.width, fitting_height(line_number))
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 设置内容
  16.   #--------------------------------------------------------------------------
  17.   def set_text(text)
  18.     if text != @text
  19.       @text = text
  20.       refresh
  21.     end
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 清除
  25.   #--------------------------------------------------------------------------
  26.   def clear
  27.     set_text("")
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 设置物品
  31.   #     item : 技能、物品等
  32.   #--------------------------------------------------------------------------
  33.   def set_item(item)
  34.     set_text(item ? item.description : "")
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 刷新
  38.   #--------------------------------------------------------------------------
  39.   def refresh
  40.     contents.clear
  41.     draw_text_ex(4, 0, @text)
  42.   end
  43. end
复制代码
这个是VA的Window_Help
来看看他是怎么使用 refresh的

{:2_253:}首先看 refresh里到底有什么
  1. def refresh                                 
  2.     contents.clear                       #内容清空
  3.     draw_text_ex(4, 0, @text)   #写字
  4.   end
复制代码
啊,很简单的两句,写的是重绘这个Help窗口。先清空,然后画上文字。
在这里可以看出refresh 的常规用法:重绘窗口内容

{:2_253:}其次来看 哪里调用了refresh这个方法
  1.   #--------------------------------------------------------------------------
  2.   # ● 设置内容
  3.   #--------------------------------------------------------------------------
  4.   def set_text(text)
  5.     if text != @text
  6.       @text = text
  7.       refresh
  8.     end
  9.   end
复制代码
在这,设置内容。如果内容和上一次的内容差异,那么调用 refresh来重画窗口=>更新一下文字内容。
例如物品窗口,每一次更改物品指针,都会调用帮助窗口的 set_text来更新一下内容。
由此可见,refresh不是窗口创建完了就没事了,当窗口需要更新重画的时候,还要调用它。

{:2_251:}废话完毕,现在开始逐条回答楼主问题:
Q:这个refresh方法和其他方法相比有特殊的地方吗?我用其他方法而不用refresh会有区别吗?
A:无,至少我认为没有区别,他们都是方法,无非就是名字问题,可能大部分人都习惯遵循使用refresh方法而不是再去定义一个莫名其妙的方法
     虽然他们的功能或许一样。
Q:哪些命令应该由refresh处理呢?
A:重绘窗口内容

免责声明:这个帖子是本人稀里糊涂路过时所留,本人脚本为自学,没有接受过系统培训,如果有纰漏或错误之处还望各位大神大触及时指出纠正,以免误人子弟。



作者: 喵呜喵5    时间: 2013-9-23 23:50
a774741359 发表于 2013-9-23 23:12
refresh无非就是一个方法,你调用它或者不调用它,它都在那里。
教程中说的是一个需要调用大量资源的方法并 ...

就是说refresh只是个普通的独立的方法名,不像update那样在scene_base中有专门的一句负责把scene中所有窗口都update一遍的语句在调用对吧?
作者: LBQ    时间: 2013-9-24 06:44
一般来讲refresh就是那种需要绘制图像绘制文字用的方法
放在update里面效率太伤
所以当需要绘制的文字或者图片有变化时才会重新调用
作者: fangyc    时间: 2013-9-24 09:44
refresh等于把窗口内的所有内容都重新绘制一把,所以每帧都调用肯定会增加负荷
一般情况下也并不需要每帧都去重绘
作者: 怪蜀黍    时间: 2013-9-24 13:04
你执行商店场景,有个金钱窗口。当你购物之后,金钱会变化,但是如果不执行金钱窗口的refresh,金钱窗口的内容是不变的,纵使你的金钱已经变化了。这时你就是在需要重绘金钱窗口时执行了refresh。
当然,你在update里执行refresh也没错,这就会时时刻刻都重绘金钱,但是这样会很耗资源,不推荐这样做。
总之,我们只需要在窗口内容变化时执行refresh。
作者: 亿万星辰    时间: 2013-9-24 18:15
[ 本帖最后由 亿万星辰 于 2013-9-24 18:17 编辑 ]\n\n[ 本帖最后由 亿万星辰 于 2013-9-24 18:17 编辑 ]\n\n一般情况下是这样,update里的算法决定是否来refresh

另外update对于有选择项的窗口还会有更新选择项光标移动的作用
比如一个窗口里面有3个选项,分别为选项1、选项2、选项3,当你用方向键移动光标时,需要用update来更新光标,但当你要把“选项3”改为“选项4”时,就需要refresh

另外,还是说金钱窗口,比如@gold_window是金钱窗口的一个实例,你可以一直执行@gold_window.update,但在update方法里,你可以写出诸如判断是否有必要进行刷新这样的操作。
当然,这不是必须的要求,只是举例而已。
super
if $game_party.gold != @gold
  @gold= $game_party.gold
  refresh
end  
作者: shiyatestzn    时间: 2013-9-24 23:54
喵呜喵5 发表于 2013-9-23 23:50
就是说refresh只是个普通的独立的方法名,不像update那样在scene_base中有专门的一句负责把scene中所有窗 ...

尾随喵呜而来,涨了不少姿势{:2_259:}
作者: a774741359    时间: 2013-9-25 13:38
fangyc 发表于 2013-9-24 09:44
refresh等于把窗口内的所有内容都重新绘制一把,所以每帧都调用肯定会增加负荷
一般情况下也并不需要每帧都 ...

VA的Scene_Base里是这么定义的
场景Update时,调用该场景内的所有窗口的Update函数。
由此可见,一般Update是不应该更换其他名字的。
作者: fangyc    时间: 2013-9-25 15:50
a774741359 发表于 2013-9-25 13:38
VA的Scene_Base里是这么定义的
场景Update时,调用该场景内的所有窗口的Update函数。
由此可见,一般Upda ...

嗯,不过自定义的类非要改也可以改,但用约定好的名字风格比较统一,也更容易理解。
因为RGSS内建类(Sprite,Window等)也有定义update这样的方法,所以自定义的类也跟它统一比较好吧。
作者: DeathKing    时间: 2013-10-1 13:35
怪我当时没写清楚。refresh一般涉及到图像重绘,图像重绘会占用较多资源。请这样想:假设我们绘制一个血条需要耗费20毫秒,如果每帧都要重绘的话,不但擦除、绘制又浪费20毫秒,而且绘制出来的效果也更原来一样。因此很多时候实用update进行逻辑层面上的判断更新(数据是否有变动),如果发现数据有变动,比如血量减少了update就会调用refresh方法来进行重绘。这样比较节省系统资源和时间。

另外,update方法是被写死了的(父类模板方法中指明了每帧都会调用窗口的update方法)。refresh则一般是建立时调用。

就功能上来说,名字并不对方法产生影响。但是由于上层抽象中就是使用的refresh这个名字,你如果要修改的话就得修改很多地方。





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