# 浅谈 !Update - Rainmeter技术教程 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7789|回复: 12

[技术交流] 浅谈 !Update

[复制链接]

签到天数: 78 天

[LV.6]常住居民II

发表于 2013-8-31 13:38:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?点击注册

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

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

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

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

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

  3. [Background]
  4. Meter=Image
  5. W=20
  6. H=10
  7. SolidColor=200,200,200,150
  8. MouseOverAction=[!ShowMeter Head][!Redraw]
  9. MouseLeaveAction=[!HideMeter Head][!Redraw]

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

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

  3. [Variables]
  4. var = 10

  5. [Calc]
  6. Measure=Calc
  7. Formula=Calc +(#var#)
  8. IfAboveValue=250
  9. IfAboveAction=[!DisableMeasure Calc][!SetOption Head UpdateDivider 100][!SetVariable var -10]
  10. IfBelowValue=10
  11. IfBelowAction=[!DisableMeasure Calc] [!SetOption Head UpdateDivider 100]
  12. [!SetVariable var 10]
  13. DynamicVariables=1
  14. Disabled=1

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

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

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

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

  3. [Head]
  4. Meter=STRING
  5. Text="一段文字"
  6. FontFace=微软雅黑
  7. FontColor=0,0,0
  8. FontSize=10
  9. SolidColor=0,0,0,1
  10. AntiAlias=1
  11. MouseOverAction=[!SetOption Head FontColor 250,250,250][!UpdateMeter Head][!Redraw]
  12. MouseLeaveAction=[!SetOption Head FontColor 0,0,0] [!UpdateMeter Head][!Redraw]
复制代码
这大概就是本文开始时的问题的最终答案了。

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

以上。
风飏

评分

参与人数 1心动值 +1 活跃值 +20 技术值 +1 收起 理由
萝莉头 + 1 + 20 + 1 原创神马的最爱了≧▼≦

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

签到天数: 118 天

[LV.6]常住居民II

发表于 2013-8-31 13:43:45 | 显示全部楼层
久未发帖,一发就给力
社区大力鼓励原创帖及技术帖,特此赠枚小勋章作为感谢,望笑纳:)

点评

0 0  发表于 2013-8-31 14:02
回复

使用道具 举报

签到天数: 392 天

[LV.9]以坛为家II

发表于 2013-8-31 19:09:03 | 显示全部楼层
hao教程,顶起
回复

使用道具 举报

签到天数: 47 天

[LV.5]常住居民I

发表于 2013-8-31 21:36:27 | 显示全部楼层
我去.看着好高能啊 . 楼主能推个基础学习的地方么
回复

使用道具 举报

签到天数: 1084 天

[LV.10]以坛为家III

发表于 2013-8-31 23:40:38 | 显示全部楼层
不会雨滴的新手路过,前辈求艹- -

点评

版主什么的就不要来卖萌了 - -  发表于 2013-9-1 10:51
回复

使用道具 举报

签到天数: 27 天

[LV.4]偶尔看看III

发表于 2013-11-21 22:44:54 | 显示全部楼层
好高深的样子(虽然没看懂)
回复

使用道具 举报

签到天数: 282 天

[LV.8]以坛为家I

发表于 2014-2-4 14:48:21 | 显示全部楼层
真心好教程!谢谢楼主分享!
回复

使用道具 举报

签到天数: 30 天

[LV.5]常住居民I

发表于 2015-1-10 01:20:14 | 显示全部楼层
学习学习..................................
回复

使用道具 举报

签到天数: 267 天

[LV.8]以坛为家I

发表于 2015-1-25 13:12:32 | 显示全部楼层
萝莉头 发表于 2013-8-31 13:43
久未发帖,一发就给力
社区大力鼓励原创帖及技术帖,特此赠枚小勋章作为感谢,望笑纳:)

温故而知新..............................
回复

使用道具 举报

签到天数: 22 天

[LV.4]偶尔看看III

发表于 2016-2-29 17:22:53 | 显示全部楼层
Godlike。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

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