【问题标题】:Performance problems when using Fabric.JS with Angular 2将 Fabric.JS 与 Angular 2 一起使用时的性能问题
【发布时间】:2017-07-24 11:30:48
【问题描述】:

我正在使用 Fabric.JS 在 Angular 2 应用程序的画布中拖动元素。当我在手机上打开我的应用程序时,拖动项目时会有相当大的延迟。最初几秒钟没有延迟,但我拖的时间越长,延迟越严重。

我决定在没有 Angular 2 的情况下使用 Fabric.JS 进行测试,发现不使用 Angular 2 时没有延迟。

在下面的代码示例中,我将三个方形对象添加到 Canvas。仅使用这三个对象几乎看不到延迟,但如果我添加许多更复杂的对象,它会变得非常糟糕。

我落后的 Angular 2 组件:

import {Component, OnInit, ViewChild, ElementRef} from '@angular/core';
import 'fabric';
declare let fabric;

@Component({
  selector: 'app-fabric-canvas',
  template: `
    <canvas #canvas width="800" height="800"></canvas>
  `
})
export class FabricCanvasComponent implements OnInit {

  @ViewChild('canvas') canvasRef:ElementRef;
  private canvas: any;
  private square1;
  private square2;
  private square3;

  ngOnInit() {
    this.canvas = new fabric.Canvas(this.canvasRef.nativeElement, { });

    this.square1 = new fabric.Rect({
      width: 50,
      height:50,
      left: 0,
      top: 0,
      fill:'red'
    });

    this.square2 = new fabric.Rect({
      width: 50,
      height:50,
      left: 0,
      top: 0,
      fill:'blue'
    });

    this.square3 = new fabric.Rect({
      width: 50,
      height:50,
      left: 0,
      top: 0,
      fill:'green'
    });

    this.canvas.add(this.square1);
    this.canvas.add(this.square2);
    this.canvas.add(this.square3);
  }
}

我的测试没有使用 Angular 2 并且没有滞后:

<canvas id="canvas" width="800" height="800"></canvas>

<script>
    var canvas = new fabric.Canvas('canvas');

    var square1 = new fabric.Rect({
        width: 50,
        height:50,
        left: 0,
        top: 0,
        fill:'red'
    });

    var square2 = new fabric.Rect({
        width: 50,
        height:50,
        left: 0,
        top: 0,
        fill:'blue'
    });

    var square3 = new fabric.Rect({
        width: 50,
        height:50,
        left: 0,
        top: 0,
        fill:'green'
    });

    canvas.add(square1);
    canvas.add(square2);
    canvas.add(square3);

</script>

问题是:为什么我只有在使用带有 Angular 2 的 Fabric.JS 时才会遇到这种延迟?我在 Angular 2 组件中导入或使用 Fabric.JS 的方式有问题吗?

【问题讨论】:

  • 我可能不是 angular2 专家,但据我所知,angular 不是运行密集 fps 依赖应用程序的地方,有一个我尚未探索过的解决方案,称为在外部运行代码角的区域。类似this
  • 感谢您的提示,这可能正是我所需要的。我会试试看。
  • 嗨。我已经使用 Fabric.js 在 Angular 2 中实现了座位预订应用程序,即使有 1000 个座位(矩形)也没有问题。这是我的Hello World Angular 2 + Fabric.js 项目。在这个项目中,我刚刚做了一个包含 1000 个项目的测试,我的移动设备上没有发现任何问题。
  • 您是否允许用户交互?比如,移动、缩放、更新对象?如果没有,这可能就是您没有遇到任何问题的原因。

标签: performance angular canvas fabricjs


【解决方案1】:

我遇到了完全相同的问题(仅限触摸)。我创建了一个全新的 Angular 2 项目,添加了 Fabric,每次触摸都会变慢。

我花了好几个小时寻找解决方案。 Angular ChangeDetectionStrategies 没有帮助,NgZone 也没有。最终,我找到了从 Fabric 源代码中删除两行的修复方法。我在他们的 GitHub 上提交了一个问题:https://github.com/kangax/fabric.js/issues/3776

删除以下两行为我解决了滞后问题:
- addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove, { passive: false });
来自_onMouseUp()-函数
- addListener(fabric.document, 'touchmove', this._onMouseMove, { passive: false });
来自_onMouseDown()-函数。

我不确定删除这些是否可行,但当 Fabric 背后的人正在努力进行合法修复时,您可以将其用作解决方案。

【讨论】:

  • 感谢您的建议。我对 NgZone 进行了一些测试,并相信我可以正常工作。但由于其他一些问题,我最终在我的项目中使用了 PIXI.JS 而不是 Fabric。
  • 我正在使用 Angular 4 和 Ionic 3 构建一个应用程序,但遇到了完全相同的问题:在浏览器上运行良好,但是当我尝试翻译/旋转对象时会遇到明显的延迟。通过删除这篇文章中建议的行,滞后问题解决了。非常感谢。
【解决方案2】:

问题来自 Zone.js 不支持 EventListenerOptions(被动等)这一事实。 v. 0.8.7 中添加的支持:https://github.com/angular/zone.js/blob/master/CHANGELOG.md#087-2017-04-21

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2018-03-24
    • 2016-11-10
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多