【问题标题】:Does reusing symbols improve SVG performance?重用符号会提高 SVG 性能吗?
【发布时间】:2012-01-26 03:51:43
【问题描述】:

假设一个相对现代的、支持 SVG 的桌面浏览器和一个由数百个类似的简单节点组成的 SVG:

  1. 可以将文档设置为多个单独的形状元素(<circle><line> 等),并定义自己的属性。
  2. 可以将文档设置为几个<symbol> 元素和许多单独的<use> 实例,这些实例可以适当地放置它们并调整它们的大小(W3 spec)。

我了解使用 <symbols>/<use> 的语义和代码维护原因,但我现在不关心这些,我正在严格地尝试优化渲染、转换和 DOM 更新性能。我可以看到<symbol> 的工作方式类似于在 Flash 中重用 sprite、节省内存并且通常是一种很好的做法。但是,如果浏览器供应商一直这么想,我会感到惊讶(这并不是该功能的真正意图)。

编辑:我不希望在 SVG 的生命周期中更改或添加基本符号,仅更改或添加实例位置、大小等

  • <symbol>/<use> 的性能有什么明确的模式吗?
  • 对于单个浏览器实现而言,它有多么特殊?
  • 重用<symbol><g>与嵌套<svg>之间有区别吗?

【问题讨论】:

    标签: performance svg visualization


    【解决方案1】:

    Rohit Kalkur 比较了使用use 创建 5000 个 SVG 符号与直接创建 SVG 符号形状的渲染速度,请参阅 here。事实证明,使用 use 渲染 SVG 形状几乎要慢 50%。他的理由是:

    use 元素从 SVG 文档中获取节点,并且 在非公开的 DOM 中复制它们

    鉴于此,我假设使用 SVG symbols 最多与手动创建 symbolss 形状一样高效。

    【讨论】:

    • 还是这样吗?使用<use/> 有什么意义,比如<paths/>
    • 如果您有非常复杂的图形并且经常使用它们,那么通过外部文件使用符号可能更有意义,因为外部文件只会加载一次并且可以轻松缓存。例如,通常图标不会经常更改,但内容会经常更改,即外部 SVG 具有比直接包含在 HTML 中更好的缓存属性。
    【解决方案2】:

    我建议你不要深度嵌套 元素。众所周知,这会导致大多数浏览器速度变慢,请参阅 herehere

    在一般情况下,虽然它应该很快,至少只要模板本身没有太大变化(因为如果你这样做了,那么每个实例也需要更新,并且每个实例都可以不同于由于 CSS 继承而休息)。

    之间在功能层面上没有太大的区别,它们都允许你定义一个坐标系(通过'viewBox'属性)。 元素不允许您这样做。注意 元素是不可见的,除非被 引用,而 默认都是可见的。但是,在大多数情况下,建议使模板成为 元素的子元素。

    【讨论】:

    • 关于嵌套的好技巧 - 我明白为什么用 DOM、CSS、符号引用的多个层次来渲染会很昂贵......
    【解决方案3】:

    如果您更改 ag 或 svg 元素的内容,那么 UI 可以查看绘制旧内容的区域以及将绘制更新的区域,然后简单地重绘这两个区域,即使它们是相同,例如改变形状的颜色。

    如果更新符号的内容,则必须重绘所有实例。通过为每个实例计算要重绘的旧部分和新部分的位置来做到这一点更加困难,因为这些区域可能会受到变换的影响,并且更简单地重绘所有实例的所有部分。某些浏览器可能会执行前者,而某些浏览器可能会执行后者。

    在任何一种情况下,UI 都必须至少跟踪符号中的更改并将这些更改传播到所有实例。这很可能会产生一些开销。

    当然,如果您只是移动单个符号实例并且内容是静态的,则不需要跟踪并且性能可能相似。

    【讨论】:

    • 好点。在我想象的场景中,符号不会在 SVG 的生命周期内更改或添加,只有实例 - 我编辑了问题以澄清这一点。
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2018-04-14
    相关资源
    最近更新 更多