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

Project1

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

[已经解决] update和refresh的区别

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
13 小时
注册时间
2014-11-12
帖子
50
跳转到指定楼层
1
发表于 2014-11-20 23:11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RUBY 代码复制
  1. class Window_Variabless < Window_Base
  2.  
  3.   def initialize(x, y, width, height)
  4.     super(x, y, width, height)
  5.     self.opacity = 0
  6.     refresh
  7.   end
  8.  
  9.  
  10.   def update
  11.     super
  12.     refresh
  13.   end
  14.  
  15.  
  16.   def refresh
  17.     self.contents.clear
  18.     create_variables
  19.     draw_actor_hp($game_party.members[0], 30, 0, 80)
  20.     draw_actor_mp($game_party.members[0], 30, 24, 80)
  21.   end
  22.  
  23.   def create_variables
  24.     self.contents.clear
  25.     self.contents_opacity = 255
  26.     self.contents.font.size=16
  27.     self.contents.font.name="方正粗圆简体"
  28.     self.contents.font.color=text_color(0)
  29.   end
  30.  
  31.  
  32.  
  33. end


RT 我感觉没什么区别 教我写窗口的人告诉我都要写进来
更新和刷新的区别是什么呢?

Lv4.逐梦者 (版主)

无限の剣制

梦石
0
星屑
10074
在线时间
5020 小时
注册时间
2013-2-28
帖子
5030

开拓者贵宾

2
发表于 2014-11-20 23:41:07 | 只看该作者
以下只是个人理解,如有不对还请大家指正
update是Window类的方法每帧都会刷新调用一次,
refresh 只是后面的子类里又定义的一个方法,通常作用是刷新绘制内容什么的,只有需要刷新绘制内容时才会调用。
就拿你的脚本做例子吧,你的脚本里的 refresh 在new生成窗口实例时的 initialize 方法中会先调用一次。然后update方法是每帧刷新的然后你的update里又调用了refresh 。那么这样就会存在效率问题(内容没变化缺一直重新绘制)。那么要怎么解决呢?
这时候你就会知道把绘制写着 refresh 的好处,就是可以控制绘制的时机,我们在这个脚本里加上一句判断内容是否改变的判断。回去看你的脚本,发现绘制的内容是队伍中队长的hp和mp。那么只要在他的hp和mp发生改变时才绘制就可以了。
于是可以这样做。

  1.   def hp_mp_change #获取hp和mp组成的数组
  2.     [$game_party.members[0].mp,$game_party.members[0].hp]
  3.   end
  4.   #然后在绘制时拿一个实例变量来储存这次绘制时hp和mp的数组
  5. def refresh
  6.     @hp_mp_change = hp_mp_change #储存绘制时的hp和mp信息
  7.     self.contents.clear
  8.     create_variables
  9.     draw_actor_hp($game_party.members[0], 30, 0, 80)
  10.     draw_actor_mp($game_party.members[0], 30, 24, 80)
  11.   end
  12.   #然后在update 里的 refresh 方法后面加一个判断 @hp_mp_change != hp_mp_change
  13.   #判断hp和mp是否改变只有他们的值改变时才调用 refresh 方法。
  14.   def update
  15.     super
  16.     refresh if  @hp_mp_change != hp_mp_change
  17.   end
复制代码
未测试

点评

感谢回答  发表于 2014-11-21 14:05

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21621
在线时间
9413 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

3
发表于 2014-11-21 03:37:53 | 只看该作者
rpg.blue/thread-333285-1-1.html

点评

感谢回答  发表于 2014-11-21 14:06

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9397
在线时间
2748 小时
注册时间
2008-9-5
帖子
3543

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

4
发表于 2014-11-21 12:08:17 | 只看该作者
都是class内定义的方法,单从命名啥的来看没啥区别~
区别就在于Scene里面怎么用~
VA的话默认Scene_Base里的画面更新update(每一帧更新)把画面里所有的窗口都用update更新,
一般情况,update就是用来维持在游戏进行的同时同步即时更新的方法名,
refresh就是用来在某些特定时间(满足啥条件之类的)给本脚本的某些内容进行更新。
但是~这只是默认的命名问题而已。

像帖子里写的直接把refresh放进update里,如果refresh里面只是数值变化的话还是没啥大问题的,
如果是加入了Bitmap相关的描画和清除的话,会大幅吃掉帧数,毕竟有些东西是不必一直刷新的。

VA的Scene有统一update,所以不太好动手,
要试试的话可以用XP看看,Scene里面的update是把窗口一个一个分开来调用update的,
自己写个窗口类,然后update的方法名字不写update,随便写个别的(比如def mengmengda),
然后在Scene的update里面写个@xxx_window.mengmengda,效果就跟update是一样的~

哒嘎啦……只是名字的不同而已,主要看内容和使用的方式~
只不过为了统一性和容易辨认,还是用默认的命名方式?

点评

感谢回答  发表于 2014-11-21 14:06

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 05:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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