最近在用cocos动画引擎写应用,为了优化性能封装了一个分帧加载的处理,简单讲就是拿到数据之后不一次性把数据展示出来,而是每一帧展示几个节点出来,每一帧作的操作少,应用体验更流畅。
1秒大概是60帧,每帧大概是16ms,一帧中做的事情太多,执行时间太久,就会导致卡顿掉帧。 由于js是单线程,单个操作耗时不宜太久,要及时把线程让出来,对庞大的任务就需要作任务分解,异步执行。cocos项目或是传统前端项目,都可以利用异步的思想来分解任务,优化性能。
封装一个任务队列,每次不直接执行任务,而是把任务往任务队列里面推,由任务中心统一调度。 可实现了2种任务分配方式, 一种每一帧固定执行几个任务,另一种是每一帧里给一个任务执行的总时间,比如8ms,这段时间内能执行几个任务就去执行几个任务。 后者任务完成时间可能会远远小于前者,并且在不同的设备上完成任务的时间可能会差别很大,能发挥机器的最大性能,不同设备都能找到合适自己的节奏,适合于一些比较单纯不会有太多副作用的任务。前者相对会耗时久一些,对于一些可能会引起很多其他副作用比如会发请求的任务,保持一种克制性的缓慢是有必要的。
在cocos中,可以在每个场景加一个调度组件,放上对应该的脚本,利用这个组件脚本的生命周期update做每一帧的处理。在传统前端项目中则需要自己在每一轮任务结束后去延时执行下一轮任务。
其实人也是这样,不能一次想把事情干完,要有节奏,有条理,有控制,适时把舞台让出来,才能更执久,保持身心健康。