【问题标题】:Why is this animation so slow in FireFox?为什么这个动画在 FireFox 中这么慢?
【发布时间】:2014-05-17 12:09:41
【问题描述】:

我正在使用 D3.js 来操作一些 SVG 元素。我(艰难地)了解到,较新版本的 FireFox 并不能很好地处理 D3 的力布局。所以我切换到一个简单的旋转,它仍然在 Firefox 中运行糟糕。在以下代码中,group1 是我动态创建的 200 个 <circle> svg 元素的数组:

function orbit( target, first ) {

  /* Other easing options here: https://github.com/mbostock/d3/wiki/Transitions#wiki-d3_ease */
  var ease = ( first ) ? 'sin-in' : 'linear';

  target
    .transition()
    .duration(40000)
    .ease( ease )
    .attrTween("transform", rotTween)
    .each('end', function(){ orbit( group1, false ); } );

  function rotTween() {
      var i = d3.interpolate(0, 360);
      return function(t) {
          return "rotate(" + i(t) + ","+width/2+","+height/2+")";
      };
  }

}

orbit( group1, true );

它在 Chrome 中非常流畅,但它在 Firefox 中就像 Choo Choo 火车一样。

根据要求,这里是group1 的选择方式:

var makeNode = function(coeficient, x, y) {
    coeficient = coeficient || 1;
    return {
        radius: (Math.random() * coeficient ).toFixed(2), 
        cx: function() { return x || Math.round(Math.random()*width) }, 
        cy: function() { return y || Math.round(Math.random()*height) }
    }
};

var nodes1 = d3.range(300).map( function(){ return makeNode(1.9); } );
var nodes2 = d3.range(700).map( function(){ return makeNode(.6); } );
// var nodes2 = [];

var svg = d3.select('#sky_svg');
var group1 = svg.append('g').attr("class", "group1");
var group2 = svg.append('g').attr("class", "group2");

var addNodes = function(group, nodes) {
    for (var i=0; i<nodes.length; i++){
        var node = nodes[i];
        var circle = group.append('circle');
        circle
            .attr("r", node.radius )
            .attr("cx", node.cx )
            .attr("cy", node.cy )
            .attr("stroke-width", 8 )
            .attr("stroke", "transparent")
            .style("fill", "#FFFFFF");
    }
}

addNodes( group1, nodes1 );
addNodes( group2, nodes2 );

【问题讨论】:

  • 嘿,你能创建一个 jsfiddle 或类似的吗?
  • 我也一直在使用 FireFox 渲染 IE/Chrome 处理的 svg 转换时遇到问题。这已将此事报告给 FF。关注帖子:groups.yahoo.com/neo/groups/svg-developers/conversations/…。你可以搜索:Firefox 的 Gecko 渲染引擎+SVG,发现 Firefox 在响应式 SVG 渲染方面表现不佳。我的建议是继续对 FF 施加压力,以解决动态 SVG 中这种糟糕的性能。
  • 您的target 是单个元素还是多个元素的选择(名称group1 暗示很多...)?如果它确实 包含许多元素,您的orbit 函数将在每个 元素的转换结束时被调用,这将大大减慢速度!使用.each("end", function(d,i){ if (!i) orbit(target);} 触发循环。它不会解决你所有的 Firefox 问题,但它是一个开始。
  • @AmeliaBR group1 var 是一个包含几百个 元素的 svg 。我很想尝试您的优化...也许将其作为答案提交,并提供更多上下文代码? (我是 D3 的新手,所以我对何时使用 .each() 仍然有点不确定)
  • 您能否在创建选择的位置发布代码,这将有助于确保我的“上下文”与您的匹配...

标签: javascript firefox animation svg d3.js


【解决方案1】:

我也一直在使用 FireFox 渲染 IE/Chrome 处理的 svg 转换时遇到问题。关注帖子:

Google 搜索:“寻找在 Firefox 中运行缓慢的 SVG”

您也可以搜索:Firefox 的 Gecko 渲染引擎+SVG,发现 Firefox 在响应式 SVG 渲染方面表现不佳。

我的建议是继续对 FireFox 施加压力,以解决动态 SVG 中这种糟糕的性能问题。

【讨论】:

猜你喜欢
  • 2011-10-10
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2011-03-11
相关资源
最近更新 更多