setInterval VS onEnterFrame
[抱歉,把setInterval 写成了updateAfterEvents]
这段时间真的累坏了
上面是setInterval,下面是onEnterFrame
跟配置貌似有很大关系……
代码:
var f:Function = function () {
_root.a_mc._x+=2;
trace("a:"+_root.a_mc._x+" by setInterval");
trace("b:"+_root.b_mc._x+" by setInterval");
};
var intervalid = setInterval(f, 1000/25);
onEnterFrame = function () {
_root.b_mc._x+=2;
updateAfterEvent();
trace("a:"+_root.a_mc._x+" by onEnterFrame");
trace("b:"+_root.b_mc._x+" by onEnterFrame");
};
现象:
onEnterFrame 不配合 updateAfterEvent
速度略高于setInterval,且流畅度较好
onEnterFrame 配合 updateAfterEvent
速度明显高于setInterval,且流畅度较好
单独使用onEnterFrame ,CPU占用80左右
单独使用setInterval,CPU占用70不到
分析:
setInterval按照时间间隔调用函数,而函数再控制MC,这样效率就低下了。
而onEnterFrame直接对MC进行操作,效率较高。
但是onEnterFrame更耗资源(CPU)
有得必有失?
不知道各位测试结果如何,有些人喜欢setInterval,有些人则热衷于onEnterFrame(比如SSO)但是我却想弄清楚这两者之间到底有什么联系和差异,以及性能的特点,这样可以在不同的场合使用相对应的最佳方法,以确定到底是用setInterval还是onEnterFrame,找到最好的解决方案。
圈内朋友的讨论:
setinterval和onenterframe
两者的联系:都是频繁运动的事件。
两者的区别:setinterval是自定义时间间隔,而onenterframe的时间间隔与帧率成反比;setinterval只有通过对intervalid的clearinterval方法才能实现移除,而onenterframe是一个movieclip类的方法,可以通过delete或者直接清除其this主体来实现移除。
setinterval的优点在于不受帧率的影响,做出的效果很流畅;不受mc的影响,可以自由定义;可以随意控制interval的大小,方便做延时。缺点在于不易进行跟踪控制,容易造成内存垃圾,反而影响效率。
onterframe的优点在于移除方便,函数体内对mc的定位比较清晰,不用构造形参。缺点在于频繁调用没有setinterval流畅。
startDrag的效果很不流畅。
建议用onMouseDown、onMouseMove、onMouseUp这三个函数的结合来取代。
本文来自:http://www.awflasher.com/blog/archives/304
Google更注重原创、时效性好的文章:
| 相关阅读 | 本月十大 |




onEnterFrame是在某帧结束之后才执行的. 如
trace("out");
onEnterFrame = function():Void {
trace("in");
delete this.onEnterFrame
}
先出out再出in
而且, 偶感觉updateAfterEvent用在onEnterFrame里有点多余, 因为他本来就是按照帧频执行的, 自然就刷新了, setInterval如果间隔小于帧频才用他, 其他的没什么.. 在偶的本本上(迅2, 1.6G, 512M, 双通道), 他们的速度是一样的, 区别只是setInterval在他前面1点..
而在偶那古董机(初代P4, 1.6G, 384M)上setInterval要慢N多.. -_-|| 莫名了.
至于两者的选择, 偶一般是能用onEnterFrame就enterFrame了, 其他还是setInterval吧
多谢Kakera参与讨论 ^__^
updateAfterEvent肯定不是这么简单,我觉得肯定另有蹊跷,至少很多动画用了它后变得非常smooth,但是我不清楚这样会不会改变具体的速度……
用我的机子看来,也是onEnterFrame快很多…
不过我的机子配置比较差,可能更能反应出差别,
fps是25,setInterval又刚好是40ms,这样用updateAfterEvent()t坦白说没什么意义,setinterval在间隔频率比fps大的情况下才是有用的,,去掉updateAfterEvent()估计还好一点,因为这种临界下的调用,真是很折磨电脑…
汗~~~在我的blog做你的as广告~~
-。-学术广告。
在我看来中国人更喜欢用onEnterFrame, 而老外则是setInterval, why?
onEnterFrame立竿见影,而setInterval有点晦涩。不过后者不需要MovieClip作为“载体”,更加灵活。
其关键在于对时间戳的管理,见此文:
http://www.awflasher.com/blog/archives/504