之前对于setInterval的一些性能多多少少也有些听闻,不过一直没有测试,今天我特意测试了一下,主要也是因为之前游戏的需要.得出了几个结论与建议.对测试过程没有兴趣的朋友可以直接跳过看后面的结论与建议.
首先测试的是timer的递增对资源的影响.帧频为12fps.n=1,结果当timer递增时CPU与内存都缓慢递增,表明setInterval用得频繁对性能还是有一定影响的.
程序代码:
var n:Number=10;
var timer:Number;
function test() {
trace(timer);
clearInterval(timer);
timer = setInterval(test, n);
}
timer = setInterval(test, n);
之后再测试对同一个setInterval,不同频率的n值时真正的频率,代码如下:
程序代码:
var n:Number=10;
var timer:Number;
var old:Number=getTimer();
function test() {
var m:Number=getTimer();
trace(1000/(m-old));
trace("----------------------------------");
old=m;
}
timer = setInterval(test, n);
测试结果如下(平均结果,有随机的跃变,两个数字代表在两个数字之间跃变):
12fps:
n Hz
1 125
5 125
8 125
10 62.5
12 62.5
20 42
25 32,37
50 18
100 5.7
200 3.78(稳定)
500 1.89(稳定)
1000 0.946(稳定)
--------------------------
20fps:
n Hz
1 200
5 200
8 100
10 90,100
12 66.7
20 50(稳定)
25 40(稳定)
50 20
100 10
200 4.87
500 2
1000 0.97(稳定)
--------------------------
50fps:
n Hz
1 500(稳定)
5 166.7
8 111,125
10 91,100
12 76.9,83.3
20 47.6,50
25 23.8
50 20
100 10
200 4.87
500 2
1000 0.97(稳定)
--------------------------
根据以上数据可以得出关于setInterval的三点结论:
1. 时间间隔虽然由n指定,但是有一个"物理上限",到达某一间隔后再也不能缩小间隔了,比如12fps时的物理上限是125ms,即8fps.
2. 间隔与帧频越接近,则误差越小.
3. 当间隔增大到某一界限时,就变得比较稳定,且误差较小,与帧频无关.
另外,根据实验数据还能得出以下三个结论:
1. 当n值比较大时(比如n=1,5,8,10),无论帧频多少,在起初的几次间隔时间都比较大,然后才逐渐趋向于某一定值.
2. 在n=10左右时间隔时间会有一次跃变,数值会突然下降原因未知.
3. 大多数时候间隔数值会在几个数值之间跃变.
综上,在使用setInterval时,其时间间隔参数真的只能起"参考作用",其具体数据是多少会因为各种情况而改变.因此我有以下三点建议:
1. 不用的setInterval一定要用clearInterval把timer标识清除掉.
2. n值不宜过高,太高则没有意义,对资源也会有额外浪费.
3. 帧频宜与n值相距不大,帧频*n=1000左右是最好的效果.如果不行,宁愿让帧频高点.setInterval低点.
来源:http://www.xfykzz.com/blog/blogview.asp?logID=275
(完)