Skip to content

requestAnimationFrame()方法永无休止的执行 #8285

@ranxiangfu

Description

@ranxiangfu

One-line summary [问题简述]

  • 背景

Angular5.0 + echarts3.8.5

问题还要从 #7047 开始说起,Animation对象里的_startLoop函数里有个递归调用step,并且self._running一直是true,这使得step一直会被调用。这在Angular的zone会触发变更检查,导致浏览器持续占用cpu。

我仔细看了 #7047里的讨论,他们通过NgZone里的runOutsideAngular()方法让AnimationFrame避开Angular的脏检查。但是requestAnimationFrame()方法仍然是一直在执行的,尽管我切换到其他页面(无图表和动画的页面),它还是一直在执行。
性能图可以看到requestAnimationFrame()还是在一直执行:
image
通过ngDoCheck()钩子看到控制台一直在打印:
image

  • 疑问
    requestAnimationFrame()应该是由页面上某个图表实例触发的,那么当我切换页面之后,这个实例在后续 理应被GC,那么requestAnimationFrame()函数也应该停止执行,而不是仍然在递归的调用。

另外当我某个页面绘制的echarts图表有一个比较复杂的动画时,由于动画的原因占用CPU会变高。而且只要打开过这个页面,访问整个项目的任何页面都变得CPU特别高,因为requestAnimationFrame()一直在执行。

Version & Environment [版本及环境]

  • ECharts version [ECharts 版本]: 3.8.5
  • Browser version [浏览器类型和版本]: Chrome 64.0.3282.186(正式版本) (64 位)
  • OS Version [操作系统类型和版本]: windows 10

Expected behaviour [期望结果]

requestAnimationFrame()方法在页面切换后停止执行。

ECharts option [ECharts配置项]

option = {

}

Other comments [其他信息]

我的图表是基于地图的迁徙图,模仿GL实例做的:http://gallery.echartsjs.com/editor.html?c=xB1a5uJTR

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions