Egret社区
1银子
最近在做项目优化的时候,涉及到了这个问题,看了很多官方关于性能分析的帖子,但关于具体的执行方案并没有掰开揉碎了讲。比如关于EnterFrame事件,官方说“减少Event.ENTER_FRAME 使用”,但是并没有给出指导意见,有些人告诉我干脆不用EnterFrame,直接用Timer代替。我之前用Flash开发游戏七八年了,知道关于“跑道模型”的运行原理,Egret的MainLoop原理其实也差不多,每一帧分为EnterFrame、Clear、StageUpdateTransform、StageDraw四个阶段。但是从使用上讲,不管你用EnterFrame还是Timer,数量多了终究是噩梦,所以抱着学习的态度,想问一下官方,Timer的每一次调用和EnterFrame相比,优势劣势如何?性能开销是否一样?每一帧所划分的阶段是不是等价的?Timer是不是也有不如EnterFrame的地方,例如GC的回收开销、内存溢出的风险等等?

最佳答案

查看完整内容

看了各位讨论了这么久,都没说到点子上。那个版主开局就拿了楼主一血。 我看过底层代码,Timer的底层实现和EnterFrame是一样的。不同点在于,Timer会多创建一个对象。所以,如果有大量使用定时器的地方,要么使用EnterFrame,要么自己封装一个统一的定时容器,就比如,100毫秒延迟的Timer,同时只存在一个,用这个Timer去驱动这100毫秒的方法。这样的好处是可以免去EnterFrame里面的额外的时间计算。另外,egret.setTimeout的底层 ...
分享到 :
0 人收藏

16 个回复

倒序浏览
qibu111  圆转纯熟 | 2017-9-12 15:04:10
看了各位讨论了这么久,都没说到点子上。那个版主开局就拿了楼主一血。
我看过底层代码,Timer的底层实现和EnterFrame是一样的。不同点在于,Timer会多创建一个对象。所以,如果有大量使用定时器的地方,要么使用EnterFrame,要么自己封装一个统一的定时容器,就比如,100毫秒延迟的Timer,同时只存在一个,用这个Timer去驱动这100毫秒的方法。这样的好处是可以免去EnterFrame里面的额外的时间计算。另外,egret.setTimeout的底层实现和Timer也是一样的,用的也是startTick。

综上所述,如果使用时间驱动,那么egret.setTimeout是最优选。没有额外的内存消耗,同时性能也一样。
junlas  斑竹 | 2017-9-12 15:18:31
“之前用Flash开发游戏七八年了”。。。。你七八年是怎么过来的。。
powerboy  登堂入室 | 2017-9-12 16:03:19
junlas 发表于 2017-9-12 15:18
“之前用Flash开发游戏七八年了”。。。。你七八年是怎么过来的。。

不正面回答问题就算了,这样嘲讽别人是为了体现你的优越感吗?Egret的AP虽然参考Flash的写法,但是用法是否完全一样你不清楚吗?Flash里的API是否都能在Egret里全部找到难道你不清楚吗?不用说别的,之前在Flash上实现的ARPG的位图引擎,你确定能完全移植到Egret上吗?不管你之前做过什么,但是你做人的态度很让人呵呵。。。
powerboy  登堂入室 | 2017-9-12 16:03:19
junlas 发表于 2017-9-12 15:18
“之前用Flash开发游戏七八年了”。。。。你七八年是怎么过来的。。

不正面回答问题就算了,这样嘲讽别人是为了体现你的优越感吗?Egret的AP虽然参考Flash的写法,但是用法是否完全一样你不清楚吗?Flash里的API是否都能在Egret里全部找到难道你不清楚吗?不用说别的,之前在Flash上实现的ARPG的位图引擎,你确定能完全移植到Egret上吗?不管你之前做过什么,但是你做人的态度很让人呵呵。。。
powerboy  登堂入室 | 2017-9-12 16:03:26
junlas 发表于 2017-9-12 15:18
“之前用Flash开发游戏七八年了”。。。。你七八年是怎么过来的。。

不正面回答问题就算了,这样嘲讽别人是为了体现你的优越感吗?Egret的AP虽然参考Flash的写法,但是用法是否完全一样你不清楚吗?Flash里的API是否都能在Egret里全部找到难道你不清楚吗?不用说别的,之前在Flash上实现的ARPG的位图引擎,你确定能完全移植到Egret上吗?不管你之前做过什么,但是你做人的态度很让人呵呵。。。
wyb815  圆转纯熟 | 2017-9-12 18:08:53
他们的功能就不是一样的吧,enterFrame是每一帧执行一次,Timer则是定时执行。性能上并没有优劣之分,根据自己的实际进行使用。
1419664796  初窥堂奥 | 2017-9-12 18:30:27
enterFrame是以30或者60帧每秒执行,如果一直执行肯定对性能有影响,timer是按照你设定的时间 规律执行,这个和我们用的setTimeout、setInterval其实是一样的 只是提供了很好控制的方法 ,对于时间设定根据《高性能JavaScript》时间低于100毫秒都容易出问题,并且timer设定的时间都是大概的,不是精准的。关于选择用哪个,需要不断执行或者判断的就用EnterFrame,间隔多久执行的用timer
powerboy  登堂入室 | 2017-9-12 20:59:17
wyb815 发表于 2017-9-12 18:08
他们的功能就不是一样的吧,enterFrame是每一帧执行一次,Timer则是定时执行。性能上并没有优劣之分,根据 ...

http://developer.egret.com/cn/2d/debug/performanceOptimization我知道功能不一样,官方的这篇优化文章里面并没有谈到关于Timer的优化,之前做Flash的时候针对Timer是有明确优化要求的,例如实例的数量、内存溢出的问题。EnterFrame里不建议放大量逻辑在里面,因为会造成单帧消耗特别大,Timer也是如此,因为CPU时间片的消耗是避免不了的。所以我觉得对于Egret来说,官方理应在性能优化这块说明一下。
powerboy  登堂入室 | 2017-9-12 21:07:35
本帖最后由 powerboy 于 2017-9-12 21:16 编辑
1419664796 发表于 2017-9-12 18:30
enterFrame是以30或者60帧每秒执行,如果一直执行肯定对性能有影响,timer是按照你设定的时间 规律执行,这 ...

会不会是这样,我个人理解,举个例子,假如游戏30帧,每帧运行的时间就是1/30,对于跑道模型性能消耗来说,如果Timer设置的时间小于等于1/30的话,EnterFrame和Timer应该是一样的,也就是说对于跑道模型4个阶段消耗的单帧时间配比应该是差不多的,如果大于1/30的话,比如设置为2000毫秒,也就相当于在第2000毫秒对应的那一帧跑道模型上执行了这个逻辑?换句话说,Timer是一个以时间为条件,可以选择在某一帧执行代码的高级EnterFrame?如果这个假设成立的话,官方应该在http://developer.egret.com/cn/2d/debug/performanceOptimization文章中写明减少EnterFrame和Timer的调用,同时把背后性能消耗的原因写清楚比较好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号

Powered by Discuz! X3.2 © 2001-2016 Comsenz Inc.

返回顶部