可视化渲染性能:canvas、svg、webgl

2,599 阅读1分钟

canvas(0-3000)

  • 指令式绘图系统
  • 影响渲染性能的主要因素
    • 绘制图形的数量
    • 绘制图形的大小 | 图形个数 | 帧率 | | ---- | ---- | | <= 500 | 60fps | | 1000 | 50fps | | 3000 | 24fps(比较流畅动画效果最低帧率)|
  • 优化
    • 优化canvas 指令
      • 根据顶点来绘制图形,顶点多,绘制指令也会多,可以通过减少顶点(切换图形方法)来优化指令
    • 使用缓存
      • 离屏canvas:offscreen canvas,绘制时将绘图指令直接通过drawImage 来绘制,也不需要fill() 方法来填充图形
      • 局限性:
        • 绘制图形状态非常多的话,需要创建大量的离屏canvas,内存消耗大,反而降低性能
        • 适用于图形状态本身不变的图形元素,若经常发生改变,缓存就要一直更新,缓存更新本身也是绘图过程,并不能减少绘制指令,反而会因为增加 drawImage 指令而产生更大开销
        • 通过缓存 drawImage 绘制的是位图,直接绘制的是矢量图,所以缓存绘制图形清晰度不是太好(fillText 渲染文字/绘制图形有较大缩放scale)
    • 分层渲染(多个canvas)
      • 局限性
        • 大量静态图形不需要重新绘制
        • 动态和静态元素绘制顺序是固定的
    • 局部重绘
      • canvas content clearReact 控制刷新动态区域
    • 优化滤镜
    • 多线程渲染

svg(0-1000)

  • 浏览器 DOM 来渲染,元素个数越多,消耗就越大。
  • 影响渲染性能的主要因素
    • 绘制图形的数量(数量增多,svg帧率下降更明显)
    • 绘制图形的大小 | 图形个数 | 帧率 | | ---- | ---- | | <= 500 | 60fps | | 3000 | 15fps |

webgl(>3000)

  • 利用 GPU 的并行处理能力,可以一次完成渲染。
  • 影响渲染性能的主要因素
    • 渲染次数(批量渲染,渲染元素的数量不直接相关)
    • 着色器执行次数
    • 着色器运算的复杂度