suixin812 发表于 2013-8-31 13:38:30

浅谈 !Update

本帖最后由 suixin812 于 2013-8-31 13:42 编辑

我们知道每一个加载了的皮肤都是按照一定时间间隔不断的更新的,这个更新的时间间隔就是节点下的Update。
我们还知道每个Meter都可能设置了UpdateDivider,这样Meter可以更新的比皮肤更新慢,比如皮肤更新5次Meter才更新1次。
在很多时候我们会遇到希望皮肤立即更新,比如当鼠标移动到一行文字上时文字改变颜色:
Update=1000


Meter=STRING
Text="一段文字"
FontFace=微软雅黑
FontColor=0,0,0
FontSize=10
SolidColor=0,0,0,1
AntiAlias=1
MouseOverAction=[!SetOption Head FontColor 250,250,250]
MouseLeaveAction=[!SetOption Head FontColor 0,0,0]这样的Meter你会感到动态效果有很强的延迟感。
通常解决这样的问题最简单直接的方法就是减小Update的数值,当Update降低到200以下时基本上就没有延迟感了。
但这个方法会导致整个皮肤的更新频率上升,并会使皮肤占用更多的CPU,所以一些有一定了解的朋友就会用到!Redraw或!Update。
本文将要解释的就是这两种Bang指令以及!UpdateMeter的用法。

“不好用”的 !Redraw
!Redraw的直接解释就是强制皮肤进行重新绘制。看起来在更改了字体颜色后立即重新绘制,这样应当就没有延迟了。
但我们在之前的代码后加上[!Redraw]后会发现延迟并没有消失,!Redaw完全没有起到任何作用。
这是为什么呢?这是因为你在了解!Redraw的时候没有同时了解!Redraw的局限。下面是对官方手册的翻译:
!Redraw                                                                                                       参数:配置
无视节点下的Update选项,立即对整个皮肤所有的可见元素进行重新绘制。
注意:Meter将使用最后一次更新时获得的Measure的返回值或变量的值。
          使用!SetOption修改的选项也不会立即生效。

问题的关键就在“注意”中所说的,当!Redraw时皮肤仍在沿用上次更新时Meter的字体颜色,所以就会看不出!Redraw的作用。
!Redraw一般在显示或隐藏某个Meter或移动某个Meter后使用是非常有效的,看下面的例子:
Update=1000


Meter=Image
W=20
H=10
SolidColor=200,200,200,150
MouseOverAction=[!ShowMeter Head][!Redraw]
MouseLeaveAction=[!HideMeter Head][!Redraw]


Meter=STRING
Text="一段文字"
FontFace=微软雅黑
FontColor=0,0,0
FontSize=10
AntiAlias=1
Hidden=1当鼠标移到时,就会显示。!Redraw用在这里就充分的发挥出了它的作用。
介于!Redraw有时候有用有时候没用这种特点,一些朋友在发现这点之后大概会选择直接全部使用!Update,省的还要区分!Redraw能否使用。

“万能”的 !Update
!Update的简单解释就是更新整个皮肤。看上去!Update应当很强悍,能无所不能得直接更新皮肤所有变量、Meter、Measure。
但正所谓人无完人金无足赤上帝都有搬不起来的石头,雨滴开发团队再次帮我们验证了这一系列老话的正确性:
随着你制作越来越多的皮肤越来越复杂的皮肤,你就会发现!Update有时候不起作用。
我们假设这样一个情景:你在做一个有动画的皮肤,为了让动画流畅,你必须把Update设置的非常小;
但为了在动画不进行皮肤不占用太多CPU,你必须给每个Meter设置很大的UpdateDivider。看下面的例子:
Update=50


var = 10


Measure=Calc
Formula=Calc +(#var#)
IfAboveValue=250
IfAboveAction=[!DisableMeasure Calc][!SetOption Head UpdateDivider 100][!SetVariable var -10]
IfBelowValue=10
IfBelowAction=[!DisableMeasure Calc] [!SetOption Head UpdateDivider 100]
[!SetVariable var 10]
DynamicVariables=1
Disabled=1


Meter=STRING
Text="一段文字"
FontFace=微软雅黑
FontColor=0,0,0,
FontSize=10
SolidColor=200,200,200,150
AntiAlias=1
DynamicVariables=1
LeftMouseUpAction=[!EnableMeasure Calc][!SetOption Head UpdateDivider 1][!Update]
UpdateDivider=100在这段代码中,你预想的效果是当鼠标在上单击时,的文本会渐变出现;再次单击文本则会渐变消失。
但你在测试的时候就会发现当你单击后,虽然被激活并开始累加,但的文本并没有随之出现或消失,而是在这5秒之后突然出现或突然消失。
经过一系列排除分析,你最后就会发现,原来是“万能”的!Update罢工了。
让我们再次回到官方手册寻找答案:
!Update                                                                                                          参数:配置
无视节点下的Update选项,立即对整个皮肤进行更新。
注意:设定了UpdateDivider选项的Measure或Meter不会被更新。

原来一切的源头又是我们对Bang指令只凭字面理解,没有看到它的局限和注意。那么对于包含UpdateDivider选项的Meter怎么更新呢?答案是使用!UpdateMeter。只要在上面代码中将[!Update]改为[!UpdateMeterHead]就可以了。

不起眼的!UpdateMeter
!UpdateMeter简单解释就是更新Meter。在!Update出现问题之前,相信你从来没有真正注意过!UpdateMeter,因为“既然可以一次更新整个皮肤所有Meter和Measure,那为什么还要有!UpdateMeter和!UpdateMeasure来一个一个更新”。
吸取之前的教训,我们直接来看一下!UpdateMeter的完整解释:
!UpdateMeter                                                                                              参数:Meter,配置
无视节点下的Update选项以及Meter下的UpdateDivider选项,立即对某个Meter进行更新。
Meter将获得Measure当前返回值、变量当前值以及Meter各个选项当前的值。
注意Meter在获得这些新值后不会立即被重新绘制,直到下次更新或者!Redraw指令被使用。
Meter:更新的Meter的名字。使用 * 更新所有Meter。
配置(可选)

这样我们就理解了为什么上一节的例子中使用!UpdateMeter替换!Update就可以了。
根据这段完整解释,我们会发现!UpdateMeter和!Redraw连用应该是个不错的主意,让我们试一试:
Update=1000


Meter=STRING
Text="一段文字"
FontFace=微软雅黑
FontColor=0,0,0
FontSize=10
SolidColor=0,0,0,1
AntiAlias=1
MouseOverAction=[!SetOption Head FontColor 250,250,250][!UpdateMeter Head][!Redraw]
MouseLeaveAction=[!SetOption Head FontColor 0,0,0] [!UpdateMeter Head][!Redraw]这大概就是本文开始时的问题的最终答案了。

本文是基于我在翻译官方手册的新发现。
恩……作为翻译组的一名成员,请允许我吐槽上一个翻译版本的各种理解不能的汉语以及各种误解歧义,再顺便吐槽一下现在翻译版本的“有生之年”的既视感,真诚的希望满福神社把所有坑都填完的时候本翻译手册也已经发布。

以上。
风飏

萝莉头 发表于 2013-8-31 13:43:45

久未发帖,一发就给力
社区大力鼓励原创帖及技术帖,特此赠枚小勋章作为感谢,望笑纳:)

傻大个牌纯碱 发表于 2013-8-31 19:09:03

hao教程,顶起

ls3322210 发表于 2013-8-31 21:36:27

我去.看着好高能啊 . 楼主能推个基础学习的地方么

Soliv_ctx 发表于 2013-8-31 23:40:38

不会雨滴的新手路过,前辈求艹- -

tlairen 发表于 2013-11-21 22:44:54

{:10_414:}好高深的样子(虽然没看懂)

旧心论 发表于 2014-2-4 14:48:21

真心好教程!谢谢楼主分享!

小逆0.0 发表于 2015-1-10 01:20:14

学习学习..................................

董连志 发表于 2015-1-25 13:12:32

萝莉头 发表于 2013-8-31 13:43
久未发帖,一发就给力
社区大力鼓励原创帖及技术帖,特此赠枚小勋章作为感谢,望笑纳:)

温故而知新..............................

Ankou 发表于 2016-2-29 17:22:53

Godlike。。。{:10_420:}
页: [1] 2
查看完整版本: 浅谈 !Update