跟月影学可视化
月影
前奇虎 360 奇舞团团长,可视化 UI 框架 SpriteJS 核心开发者,《JavaScript 王者归来》作者
30206 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
跟月影学可视化
15
15
1.0x
00:00/00:00
登录|注册

29 | 怎么给Canvas绘制加速?

在WebWorker中以单独的线程渲染Canvas
使用离屏Canvas应用滤镜后绘制到画布上
合并图形应用相同滤镜的过程
使用脏区检测动态计算需要重绘的区域
根据动态元素的包围盒进行局部刷新
绘制静态图形和动态图形分别在不同Canvas层
通过drawImage绘制缓存图形
创建离屏Canvas缓存图形
用arc指令替代绘制多边形
减少绘图指令数量
多线程渲染
优化滤镜
局部重绘
分层渲染
使用缓存
优化Canvas指令
性能优化手段

该思维导图由 AI 生成,仅供参考

你好,我是月影。
上节课,我们从宏观上了解了各个图形系统在性能方面的优劣,以及影响性能的要素。实际上,想要解决性能问题,我们就必须要知道真正消耗性能的点,从而结合项目需求进行有针对的处理,否则性能优化就是纸上谈兵、空中楼阁。
所以这节课,我们就深入讨论一下影响 Canvas 绘图性能的因素,一起来分析几个不同类型的 Canvas 项目,找到的性能瓶颈以及对应的解决办法,从而学会对大部分 Canvas 项目进行性能优化。
我们知道,Canvas 是指令式绘图系统,它有状态设置指令、绘图指令以及真正的绘图方法(fill 和 stroke)等各类 API。通常情况下利用 Canvas 绘图,我们要先调用状态设置指令设置绘图状态,然后用绘图指令决定要绘制的图形,最后调用真正的 fill() 或 stroke() 方法将内容输出到画布上。
那结合上节课的实验我们知道,影响 Canvas 性能的两大因素分别是图形的数量和图形的大小。它们都会直接影响绘图指令,一个决定了绘图指令的多少,另一个决定了绘图指令的执行时间。通常来说,绘图指令越多、执行时间越长,渲染效率就越低,性能也就越差。
因此,我们想要对 Canvas 性能进行优化,最重要的就是优化渲染效率。常用的手段有 5 种,分别是优化 Canvas 指令、使用缓存、分层渲染、局部重绘和优化滤镜。此外,还有一种手段叫做多线程渲染,是用来优化非渲染的计算和交互方面导致的性能问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Canvas绘图性能优化是本文的主题,文章介绍了6种常见的优化手段。首先,分析了影响Canvas绘图性能的因素,包括图形数量和大小。重点讨论了优化Canvas指令和使用缓存这两种优化手段,通过减少绘图指令的数量和使用缓存来提高绘图性能。另外,介绍了分层渲染和局部重绘两种优化手段,分别适用于不同的绘图场景。文章还提到了优化滤镜和多线程渲染的方法,以及如何在WebWorker中以单独的线程来渲染,避免对主线程的阻塞。总结了性能优化的原则,包括减少绘图指令数量、使用缓存、分层渲染、局部重绘、优化滤镜和多线程渲染。最后,鼓励读者尝试实现一个粒子效果,并分享本文的内容。整体来说,本文内容丰富,涵盖了多种优化手段,对于需要提升Canvas绘图性能的开发者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《跟月影学可视化》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 嗨小二
    “因为不使用缓存直接绘制的是矢量图,而通过缓存 drawImage 绘制出的则是位图“,我怎么记得canvas绘制的都是位图,因为使用canvas绘制图形,放大后就会失真,为什么这里会说”不使用缓存直接绘制的是矢量图“,麻烦解释下

    作者回复: 你可以试一下,现代浏览器的Canvas绘制的图放大不会失真了,当然这里不是放大网页本身,而是在Canvas中放大Path2D绘制的图形。

    2020-10-25
    5
  • Mingzhang
    在屏幕上显示主 Canvas,利用 transferControlToOffscreen 将绘制交由 offScreen canvas 来绘制,而主 Canvas 负责监测鼠标在其上的 move 事件,然后将 event 的坐标 postMessage 给 Web Worker。请问月影这种方法可行吗?

    作者回复: 可以的

    2020-08-28
    2
    5
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部