Project1

标题: refresh和update的具体用法和区别 [打印本页]

作者: 邱小谦    时间: 2016-4-7 23:22
标题: refresh和update的具体用法和区别
如题,求高手解答@RyanBern  
作者: RyanBern    时间: 2016-4-7 23:43
本帖最后由 RyanBern 于 2016-4-9 08:37 编辑

在RGSS1中,refresh和update是两个常用的方法名称,它们出现在各个脚本当中。从字面含义上来看,refresh有“刷新”的含义,update则翻译成“更新”。似乎不是很好区分。但是,从他们所代表的方法上来看,二者表示的方法的本质是截然不同的,所以有必要做区分。很多脚本新手将需要写在update里的东西写在refresh,或者是反过来,这都是不熟悉RGSS1脚本约定导致的。

一般说来,update里面定义的方法,都是需要每一帧执行的方法。例如输入响应判断,窗口的光标闪烁,图片的位置等等。我们注意到这些语句都必须在每一帧执行,一个游戏必须时刻判断你的输入才能及时作出响应,必须连续更新窗口的光标才会有“闪烁”的效果。道理很简单,我们打开每一个Scene的脚本,都会看到如下的类似结构
RUBY 代码复制
  1. loop do
  2.   Graphics.update
  3.   Input.update
  4.   update
  5.   # ....
  6. end

如果转到update的定义,我们仍然看到的是对众多对象调用update方法。虽然会出现极个别的refresh方法,但是这些特殊情况我们放在后面说。

而在refresh中的语句,一般不需要每帧都执行,他们只是在需要执行的时候才执行。换句话说,refresh的调用不是实时的,一般只有在需要它的时候才会调用一次。如果将一些refresh放在update下,那么游戏会出现明显的卡顿。

各个窗口的定义中,都会有一个refresh方法,这个方法用于描绘窗口的内容。描绘操作需要消耗大量的时间,所以refresh一般只在窗口生成的时候调用一次,在其他时刻一般不调用。

通俗地讲,update是时刻都在调用,refresh是需要才会调用。

因此,这样的一个问题就出现了:如果我想在地图界面上显示一个窗口,窗口的里面描绘某变量的数值。描绘语句应属于refresh,而根据原则,refresh不能实时调用。那么,如果这个变量突然变化,那么这个窗口岂不是无法更新了吗?如果不能直接将refresh放在update中去,那么应该如何设置才能有实时更新的效果,而又不用实时调用refresh呢?

这是一个很好的问题,很多脚本新手应当先学会它。

我们可以给窗口设计一个变量,来表示当前所显示的数字,然后在update方法中,将这个变量不断和游戏全局变量比对,如果发现不等就调用refresh更新窗口。这样,我们不用时刻调用refresh,只要在需要更新的时候调用就行了。总之一句话,update里面不要放置计算量大或者消耗资源的操作,而像这种变量比较之类的,放在update里面一点问题也没有。

下面就是一个简单的例子,请体会update和refresh结合的效果。
RUBY 代码复制
  1. def update
  2.   if @gold != $game_party.gold
  3.     @gold = $game_party.gold
  4.     refresh
  5.   end
  6. end
  7. def refresh
  8.   self.contents.clear
  9.   self.contents.draw_text(4, 0, 64, 32, @gold.to_s)
  10. end





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