理智地、负责任地、透明地推广Firefox
您可能也对这些感兴趣
切换

setInterval VS onEnterFrame
[抱歉,把setInterval 写成了updateAfterEvents]
这段时间真的累坏了

上面是setInterval,下面是onEnterFrame
跟配置貌似有很大关系……

代码

// Flash‘s FPS is set at 25!!!
  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,找到最好的解决方案。

圈内朋友的讨论:

引用自 James.li at www.Flashsun.com/club
个人的愚见:
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

哇!跟我一样,您也是一名Firefox用户,这些话题您可能感兴趣:

RSS feed | Trackback URI

才 7 条评论 ( 展开所有评论 | 收起所有评论 ) 立刻发表评论 »

kakera
2005-07-25 20:28:40

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吧

aw
2005-07-26 08:21:01

多谢Kakera参与讨论 ^__^

updateAfterEvent肯定不是这么简单,我觉得肯定另有蹊跷,至少很多动画用了它后变得非常smooth,但是我不清楚这样会不会改变具体的速度……

FlankerMX
2005-07-29 21:29:05

用我的机子看来,也是onEnterFrame快很多...
不过我的机子配置比较差,可能更能反应出差别,

fps是25,setInterval又刚好是40ms,这样用updateAfterEvent()t坦白说没什么意义,setinterval在间隔频率比fps大的情况下才是有用的,,去掉updateAfterEvent()估计还好一点,因为这种临界下的调用,真是很折磨电脑...

Andrew
2007-04-03 17:18:37

汗~~~在我的blog做你的as广告~~

aw
2007-04-03 18:52:04

-。-学术广告。

lastsecond
2008-03-04 10:06:56

在我看来中国人更喜欢用onEnterFrame, 而老外则是setInterval, why?

aw
2008-03-04 11:34:53

onEnterFrame立竿见影,而setInterval有点晦涩。不过后者不需要MovieClip作为“载体”,更加灵活。
其关键在于对时间戳的管理,见此文:
http://www.awflasher.com/blog/archives/504