Looper.dll测试
本帖最后由 suixin812 于 2013-11-21 10:21 编辑背景
众所周知,一个Update=1000的皮肤,是绝对不可能做到以100ms更新一次的动作的,
皮肤的任何一个部分的更新速率都只可能比皮肤整体慢,而不可能比皮肤整体更新快。
因此当我们需要制作一个流畅动画效果时,必须要将皮肤的更新速率调整到1秒以下,
对于一个流畅的效果,例如飞入飞出、淡入淡出、放大缩小等动画,一般需要的更新速率为20~50。
而一个皮肤的更新速率调整到这个范围,通常会占用较大的CPU。
对于大型皮肤尤其如此。
虽然可以用UpdateDivider来挽回一些。
并且很多时候,这些动画只在皮肤的一个很小的时间段发生,皮肤绝大多数时间都是静止的
因此用这么长时间的较高CPU占用,来换取一个很短时间的动画效果,通常是不经济的,不划算的。
所以我想到用插件来解决这个问题。
Looper
这个插件的目的就是为了打破皮肤的局部刷新只能比整个皮肤慢而不能快的这个限定,
让Update=1000的皮肤也能有动画效果。
其具体实现方式为:
当插件收到皮肤的指令后,开始一个循环,每次循环执行皮肤设定的Bang指令。
如此便实现了局部刷新高于总体刷新的目的。
选项
Measure=Plugin
Plugin=Looper
Update=40
设置循环的间隔,单位毫秒。
Cycle=20
设置循环的次数。注意循环次数x循环间隔必须小于1000ms,即动画效果必须在1秒内完成。
Bang=[!SetOption mExt Formula (10*sin(%i/20/2*PI))][!UpdateMeasure mExt][!UpdateMeter *][!Redraw]
每次循环时执行的Bang指令。
其中%i代表从1到Cycle的循环变量,只能在Bang指令中用一次,区分大小写。
Bang指令
格式:[!CommandMeasureLooper节点名参数]
Loop
读取设置,并开始循环。
Stop
提前停止循环。在上一个循环结束前,下一个循环不能开始。
存在问题
这个插件显而易见的存在问题。
那就是循环时间不能太长,如果太长Rainmeter会停止响应。
发生这个的原因是当Rainmeter向插件传递Bang指令时,
插件创建了一个循环并开始有暂停的执行。
在这期间,因为Rainmeter对插件传递Bang指令是一个单线程操作,
而这个插件创建的循环本身也是单线程的,
因此在循环结束前,在函数返回前,Rainmeter是无响应状态的。
为了防止Rainmeter太长时间无响应结果真的变成无响应,所以只能把循环时间压缩到1秒以内。
即使这样,当你观察Update=500的皮肤中的计数器的时候,还是会发现明显的卡了一下
下载
注意下面这个只包含32位的插件,因为平台关系没办法生成64位的插件
压缩包内包含一个示例皮肤,并包含相应注解
不能直接在插件里限定循环时间在1秒里,就是上限<1秒,以后能改造成多线程时再取消限定。。。。这个只是提议,不作参考 在学校 无力中T^T 既要低消耗cpu又要棒棒的效果。楼主~致敬。 QAQ我用不了…只能围观了 yking1997 发表于 2013-11-21 11:17
不能直接在插件里限定循环时间在1秒里,就是上限
这个是在插件中有限制的,如果输入时间大于1秒会有错误提示的。多线程这个我真的去查了一下,但真的把我看疯了,创建新线程本身好像不算太麻烦,但创建完后涉及到传递参数、管理线程、结束线程等等的问题,再加上引用了创建线程的头文件后插件一下大了那么多,所以我干脆就简单一点好了,勉强实现一个短暂的动画效果就凑合用了╮(╯_╰)╭ {:10_427:},楼主辛苦了,继续努力 我是来红经验的。 没有64的话只能路过了 谢谢lz分享 抱走