疯狂的技术宅

以前出于工作目的,编写和翻译了大量的技术文章,以前端为主,删掉了过时的、毫无营养的内容,留下的都是精华。


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于本站

  • 回到主站

  • 搜索

对SVG动画进行异步光栅化处理

时间: 2019-01-21 分类: 前端技术   字数: 1028 字 阅读: 3分钟
标签: #Javascript# #光栅化# #SVG# #动画#
  • 本文译自:http://jakearchibald.com/2017/lazy-async-svg/
  • 译者:疯狂的技术宅

渲染SVG图像可能会非常慢

在转换 SVG 图像时,浏览器会试着在每一帧上进行渲染,以便使图像尽可能的清晰。 不幸的是,SVG渲染可能会很慢,特别是对于较大的图像。

这里是一个DEMO ,打开后点击“Scale SVG”查看效果。

图:使用 Devtools 查看SVG动画的时间线

图:使用 Devtools 查看SVG动画的时间线

这是一个非常复杂的SVG,在某些帧上消耗的时间是我们帧预算的10倍,所以这个动画看起来非常糟糕。 这是在一款功能强大的MacBook上做的测试。

如果是更简单的SVG,就不那么糟了。 这是用Firefox的logo演示的另一个例子 ,看起来效果还可以。

不过新API为我们提供了更多的控制方法:

SVG栅格化的惰性处理

createImageBitmap(imgElement).then(imageBitmap => { 
  // … 
}); 

createImageBitmap 可以将许多不同的图像栅格化为位图数据,这些数据可以绘制到canvas元素上。 但是,在Chrome 61+中,启用了chrome://flags/#enable-experimental-canvas-features,它可以为 SVG 图像启用HTML图像元素,并在主线程之外进行异步的栅格化处理,所以不会破坏动画。

另外你还可以只渲染SVG的一部分,并以特定大小进行输出:

createImageBitmap( 
  imgElement, 
  sourceCropX, sourceCropY, 
  sourceCropWidth, sourceCropHeight, 
  {resizeWidth, resizeHeight} 
).then(imageBitmap => …); 

这允许我们非常方便的使用画布对SVG进行位图缩放,同时渲染被裁剪后且非常清晰的版本。 一旦清晰版准备就绪,就可以将其包含在动画中。

这里是一个DEMO ,按“Scale canvas”查看效果。 需要Chrome 61+ 中查看,并启用 chrome://flags/#enable-experimental-canvas-features 。

img

图:Devtools中画布动画的时间线

使用这种方法对CPU来说更加友好,动画也很流畅:

查看SVG动画与SVG-in-canvas两种效果比较的视频演示:https://youtu.be/-yQBbWlXuqg

对于复杂的汽车SVG图像,最后才会出现清晰的图像。 使用Firefox徽标时,清晰版出现得更早,因为渲染时间更短。

DEMO的所有代码:https://glitch.com/edit/#!/svg-zoom-demo?path=script.js:1:0

平滑光栅化

从上面的时间线可以看出,Chrome在将更清晰的纹理传到GPU时仍然会跳过一帧。 这个问题可以通过将工作分块为更小的块来解决,因此GPU上传不会破坏帧预算。

OpenSeadragon :可以动态加载图像切片,并创建可缩放图像。 它非常适合从网络中获取位图数据,但有点hack。

Zoomable lazy-rendered tiled SVG : 需要Chrome 61+并启用 chrome://flags/#enable-experimental-canvas-features 。

是的,边缘有一点粗糙。 就像我前面说的那样,这是一个hack。 不过我真的对此很兴奋,对 SVG 图像更加酷炫的处理技术在逐渐用于web。

标签: #Javascript# #光栅化# #SVG# #动画#

标题:对SVG动画进行异步光栅化处理

链接:https://fe-tech.viewnode.com/post/201901/21/

作者:疯狂的技术宅

声明: 本博客文章除特别声明外,均采用 CC BY-NC-ND 4.0 国际许可协议( 知识共享署名-非商业性使用-禁止演绎 4.0),转载请注明出处!

异步函数中的异常处理及测试方法
一步步教你用HTML5 SVG实现动画效果
  • 文章目录
  • 站点概览
疯狂的技术宅

疯狂的技术宅

退休程序员,硬件发烧友,人工智能爱好者。写写代码喝喝茶,晒晒太阳带带娃。

457 日志
8 分类
583 标签
GitHub
友情链接
  • viewnode
  • mofish
标签云
  • Javascript 172
  • Node.Js 62
  • Vue 36
  • Typescript 28
  • 实战项目 28
  • 面试 21
  • React 20
  • Css 17
  • 面试题 16
  • 教程 13
  • Promise 12
  • Chrome 9
  • Debug 9
  • 调试 9
  • 资源 9
  • Deno 8
  • Dom 8
  • 杂谈 8
  • 正则表达式 8
  • 测试 8
    • 渲染SVG图像可能会非常慢
    • SVG栅格化的惰性处理
    • 平滑光栅化
© 2018 - 2022 疯狂的技术宅 All Rights Reserved
Powered by - Hugo v0.99.0 / Theme by - NexT
Storage by 俺的服务器 / 冀ICP备2022010157号
0%