账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    使用SVG.js绘制图表,由于绘制元素过多导致UI阻塞有什么解决方法吗?
    42
    0

    需求比较特别,是个比较复杂的网络拓扑图,要画得比较整齐。找了很久都没有找到现成的库。所以就用SVG.js自己撸了一个,但是在数据变多的时候画图时间就变得很长,现在的数据已经接近10s,数据还有继续增长的可能。

    当初也是一时脑抽选了SVG,可能选Canvas会比较好,而且也并没有特别需要SVG的事件处理能力之类的需求,但是现在时间有限,想看看有没什么办法可以临时处理一下。

    想在后台渲染好之后把svg的xml传到前台显示,发现node.js上由于缺乏DOM相关的API,使用SVG.js作者推荐的svgdom来做DOM API的polyfill,发现各种图形的定位已经乱掉了。JSDOM也好像缺乏对SVG的支持。至于PhantomJS或者headless Chrome这种有点复杂,需要点时间学习。

    试过把不涉及DOM的抽出来放到WebWorker上运行,绘图还是需要1~2s。这个图还是要放在首页的,总不能让用户一进来先卡个几秒钟吧。

    有没有大神造过类似的轮子能提供点优化的思路,先谢了~~

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 敬往事一杯酒 普通会员 1楼

      SVG.js 是一个开源的 JavaScript 库,用于在网页上绘制矢量图形。由于SVG元素的数量过多,可能会导致 UI 阻塞。这可以通过以下几种方式解决:

      1. 使用 SVG 绘图引擎(如 D3.js 或 Chart.js):这些库可以处理大量的SVG元素,并且它们通常提供更高效的渲染性能。这些库也提供了更复杂的图形设计功能,如动画和交互。

      2. 分层使用SVG元素:如果你只需要处理一部分SVG元素,你可以尝试分层使用它们。这将允许你只处理需要的部分,而不是所有的SVG元素。

      3. 使用流式布局:流式布局可以让你的SVG元素按照一定的顺序排列,从而减少UI阻塞。

      4. 使用 lazy loading:如果可能,你可以尝试使用 lazy loading,这是一种技术,可以在页面加载时只加载需要的部分SVG元素。

      5. 使用 SVG 模板:SVG 模板是一种将SVG元素组合在一起的格式。通过使用SVG模板,你可以将多个SVG元素组合在一起,而不是将它们分别绘制。

      6. 使用 CSS flexbox 或 grid:这些布局方法可以帮助你更有效地管理SVG元素的排列,从而减少UI阻塞。

    • 烈焰滔滔 普通会员 2楼

      SVG.js 是一个开源的 JavaScript 库,用于在网页上绘制矢量图形。由于SVG元素的数量过多,可能会导致 UI 阻塞。这可以通过以下几种方式解决:

      1. 使用 SVG 绘图引擎(如 D3.js 或 Chart.js):这些库可以处理大量的SVG元素,并且它们通常提供更高效的渲染性能。这些库也提供了更复杂的图形设计功能,如动画和交互。

      2. 分层使用SVG元素:如果你只需要处理一部分SVG元素,你可以尝试分层使用它们。这将允许你只处理需要的部分,而不是所有的SVG元素。

      3. 使用流式布局:流式布局可以让你的SVG元素按照一定的顺序排列,从而减少UI阻塞。

      4. 使用 lazy loading:如果可能,你可以尝试使用 lazy loading,这是一种技术,可以在页面加载时只加载需要的部分SVG元素。

      5. 使用 SVG 模板:SVG 模板是一种将SVG元素组合在一起的格式。通过使用SVG模板,你可以将多个SVG元素组合在一起,而不是将它们分别绘制。

      6. 使用 CSS flexbox 或 grid:这些布局方法可以帮助你更有效地管理SVG元素的排列,从而减少UI阻塞。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部