我的编程空间,编程开发者的网络收藏夹
学习永远不晚

HTML-Canvas的优越性能以及实际应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

HTML-Canvas的优越性能以及实际应用

HTML绘图届的前辈:SVG

Canvas是HTML5时代引入的“新”标签。与很多标签不同,Canvas不具有自己的行为,只将一组API 展现给客户端 JavaScript ,让开发者使用脚本把想绘制的东西画到一张画布上。

在HTML5之前,人们通常使用SVG来在页面上绘制出图形。SVG使用XML来定义图形,就像使用HTML标签和样式定义DIV一样,我们也可以将一个空白的DIV想象为长方形的SVG,两者的设计思想是相通的,SVG的本质就是一个DOM元素。而Canvas则不同,Canvas提供的是 JavaScript 的绘图 API,而不是像 SVG那样使用XML 描述绘图,通过JavaScript API直接完成绘制,比起修改XML来说要更简便、更直接。

除了定义的方式不同,Canvas和DOM(当然也包含SVG)的差异更多的体现在浏览器的渲染方式上。

浏览器在做页面渲染时,Dom元素是作为矢量图进行渲染的。每一个元素的边距都需要单独处理,浏览器需要将它们全都处理成像素才能输出到屏幕上,计算量十分庞大。当页面上内容非常多,存在大量DOM元素的时候,这些内容的渲染速度就会变得很慢。

(Canvas)

而Canvas与DOM的区别则是Canvas的本质就是一张位图,类似img标签,或者一个div加了一张背景图(background-image)。所以,DOM那种矢量图在渲染中存在的问题换到Canvas身上就完全不同了。在渲染Canvas时,浏览器只需要在JavaScript引擎中执行绘制逻辑,在内存中构建出画布,然后遍历整个画布里所有像素点的颜色,直接输出到屏幕就可以了。不管Canvas里面的元素有多少个,浏览器在渲染阶段也仅需要处理一张画布。

然而这样更加强大的功能,不可避免的让使用canvas渲染有很高的门槛。Google Docs在构建Canvas的过程中重新定义了往常已经被人们所熟悉的内容,例如精确定位、文本选择、拼写检查、重画调优等。为什么更多开发者还是选择了接纳Canvas这个门槛更高的技术路线呢?这就得回到Canvas的最大优势:渲染性能。

Canvas的渲染模式

这里的渲染是指浏览器将页面的代码呈现为屏幕上内容的过程。Canvas和Dom的渲染模式完全不同,搞清楚这个差异对理解Canvas的性能优势至关重要。

Dom:驻留模式

驻留模式(Retained Mode)是Dom在浏览器中的渲染模式。下图粗略展示了这一过程的工作流程。

(驻留模式)

DOM的核心是标签,一种文本标记型语言,多样性很强且多个标签之间存在各种关联(如在同一个DIV下设置为float的子DIV)。浏览器为了更好的处理这些DOM元素,减少对绘制API的调用,就设计了一套将中间结果存放于内存的“驻留模式”。首先,浏览器会将解析DOM相关的全部内容(包含HTML标签、样式和JavaScript),将其转化为场景(scene)和模型(model)存储到内存中,然后再调用系统的绘制API(如Windows程序员熟悉的GDI/GDI+),把这些中间产物绘制到屏幕。

驻留模式通过场景和模型缓存减少了对绘制API的调用频次,将性能压力转移到场景和模型生成阶段,即浏览器需要根据DOM上下文和BOM中的尺寸数据,“自行判断”每一个元素的绘制结果。

Canvas:快速模式

Canvas采用了和DOM不同的快速模式(Immediate Mode),让我们先来看看快速模式是如工作的:

(快速模式)

Canvas的应用优点

上面介绍的两种不同的模式直接造成了Dom和Canvas的性能差异。对于使用快速模式渲染的Canvas而言,浏览器的每次重绘都是基于代码的,不存在能让处理流程变慢的多层解析,所以它真的很快。除了快之外,Canvas的灵活性也大大超出DOM。我们可以通过代码精确的控制如何、何时绘制出我们想要的效果。

在资源消耗上,DOM的驻留模式意味着场景中每增加一点东西就需要额外消耗一些内存,而Canvas并没有这个问题。这个差异会随着页面元素的数量增多而愈加明显。以B端的企业应用场景为例,表单那种数据量比较小的场景,不同渲染模式带来的效果差异并不明显;但在工业制造、金融财会等类Excel电子表格操作的场景下,单元格数量动辄便是上百万(5万行x 20列)甚至上亿个,浏览器需要对表格所有单元格本身内容进行渲染,同时还涉及到丰富的数据处理,情况就完全不同了。

(Web页面上的电子表格,包含1百万个单元格)

在Canvas出现之前,在前端渲染表格时只能通过构建复杂的DOM来实现。这种方式下,浏览器的性能成为了Web应用瓶颈,让很多开发者放弃了在浏览器上实现电子表格的想法。

在Canvas出现后,快速模式带来的性能优势无疑是一个巨大的亮点,大量、复杂的DOM渲染处理带来的性能问题终于有了解决途径。

回到电子表格的应用场景,业内已经出现了使用Canvas绘制画布的表格组件,这类组件在渲染数据层时不仅无需重复创建和销毁DOM元素,在画布的绘制过程中,也比Dom元素渲染的限制更少。除了表格之外,Canvas也为数字孪生可视化大屏、页面游戏等场景带来了变革。

(数字孪生大屏,精确控制各种形状、样式)

总结

总结一下,在渲染模式上,Canvas站在了DOM的对面,浏览器对其内容一无所知,一切渲染的权利回到了开发者的手上,这个改变带来了显著的性能优势。此外,我们可以使用Canvas绘制种类更为丰富的UI元素,如线形、特殊图形等,通过画法逻辑,还可以实现更加精准的UI界面渲染,解决了浏览器差异造成的样式误差,让更多应用场景可以顺利迁移到Web平台上来。

参考资料:

· Canvas的Wiki介绍

· Canvas社区

· 基于Canvas表格组件 SpreadJS

到此这篇关于HTML-Canvas的优越性能以及实际应用的文章就介绍到这了,更多相关Canvas性能及应用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

HTML-Canvas的优越性能以及实际应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ASP性能监视器在实际中的应用:优化网站性能的成功案例

ASP性能监视器是一款强大的工具,可以帮助开发人员诊断和优化应用程序的性能。本文将通过一个实际案例,介绍如何使用ASP性能监视器来优化网站的性能,从而提高用户体验。
ASP性能监视器在实际中的应用:优化网站性能的成功案例
2024-02-11

RiSearch PHP 高性能搜索引擎的实际应用

导语:随着互联网的迅猛发展,搜索引擎已经成为人们获取信息的主要途径之一。而针对大数据的高性能搜索引擎也变得尤为重要。RiSearch是一种PHP搜索引擎,被广泛应用于各种网站和应用程序中,具有高效、可靠和易于使用的特点。本文将重点介绍RiS
2023-10-21

PHP除以10000的应用与性能优化探究

标题:PHP除以10000的应用与性能优化探究在PHP编程中,除以10000可能是一个看似简单但实际上却有一定技术含量的操作。本文将探讨PHP中除以10000的应用场景,以及针对这种操作进行的性能优化探究。通过具体的代码示例和技术解析,希
PHP除以10000的应用与性能优化探究
2024-03-06

Golang Sync包在提高程序性能中的实际应用

Golang的Sync包提供了一些用于并发编程的工具,可以帮助提高程序性能。下面是Sync包在实际应用中的一些示例:1. 互斥锁(Mutex):互斥锁用于保护共享资源的访问,一次只允许一个goroutine访问被互斥锁保护的代码段。通过使用
2023-10-08

Python环境的实际应用方案以及代码怎么编写

这篇文章将为大家详细讲解有关Python环境的实际应用方案以及代码怎么编写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下载Python源码解压,编译安装,不需要特殊操作。安装sh setu
2023-06-17

Python安装以及配置在实际应用的过程中的强大功能是怎样的

这篇文章给大家介绍Python安装以及配置在实际应用的过程中的强大功能是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python安装 配置作为计算机语言中常用的计算机语言,在实际的应用过程中仍然有人对Pytho
2023-06-17

redis性能优化之生产中实际遇到的问题及排查总结

这篇文章主要介绍了redis性能优化之生产中实际遇到的问题及排查总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-22

PHP 防抖技术的优势及其在实际项目中的应用

随着移动互联网的快速发展,用户对于web应用程序的要求也越来越高。随着用户在web应用程序中的操作频繁增加,前端错误的增加也是不可避免的。这导致程序的连续,重复的请求,从而占用系统资源,降低程序的性能和响应速度。为了解决这个问题,我将会介绍
2023-10-21

Golang的主要特性及其在不同领域的实际应用展示

Golang(Go语言)的主要特性及其在不同领域的实际应用展示作为一种新兴的编程语言,Golang自诞生之日起就备受关注和青睐。它具有工业级别的性能和效率,并且设计简单、易读、易维护。本文将介绍Golang的主要特性,以及它在不同领域的实
Golang的主要特性及其在不同领域的实际应用展示
2024-03-06

PHP 函数新特性在实际应用中的优势示例有哪些?

php 新特性在实际应用中提供了显著优势:箭头函数:简化匿名函数语法,提高可读性。匹配表达式:提供更简洁的模式匹配,提升代码可读性。解构赋值:轻松提取数据结构的一部分,简化数据处理。null 安全运算符:无需检查 null 值即可访问属性,
PHP 函数新特性在实际应用中的优势示例有哪些?
2024-05-04

PHP 应用程序性能优化中 CodeIgniter 框架的高性能实践

codeigniter 框架通过以下实践提升 php 应用程序性能:启用 apc 缓存以加速 php 代码执行。使用数据库缓存存储频繁查询的结果,避免数据库交互。优化查询以减少不必要的数据检索和使用适当的索引。减少 http 请求数量,通过
PHP 应用程序性能优化中 CodeIgniter 框架的高性能实践
2024-05-03

PHP 应用程序性能优化中的缓存应用与实现

在 php 应用程序中,缓存技术通过临时存储经常访问的数据,提高性能和用户体验。常见的缓存策略包括页面缓存、数据缓存和对象缓存。php 提供了多种缓存技术,如文件缓存、内存缓存和对象缓存。本文以电子商务应用程序为例,演示了如何使用页面缓存优
PHP 应用程序性能优化中的缓存应用与实现
2024-05-04

Golang中的同步原语及其在性能优化中的应用

在Golang中,同步原语是用于控制并发访问共享资源的工具。以下是Golang中常用的同步原语以及它们在性能优化中的应用:1. 互斥锁(Mutex):互斥锁用于保护临界区,一次只允许一个goroutine访问共享资源。互斥锁的应用场景包括读
2023-10-08

Apache的压力测试以及web性能优化的常用知识总结

这篇文章主要介绍了Apache的压力测试以及web性能优化的常用知识总结,笔记由《构建高性能web站点》这本高人气书籍整理而来,需要的朋友可以参考下什么是带宽?误解:“数据在线路中的移动速度”、“数据的传输速度”我们所说的带宽是指数据的发送
2023-06-05

Linux平台Docker容器化应用的性能调优实践

在Linux平台上,Docker容器化应用的性能调优实践涉及多个方面,包括Dockerfile优化、网络性能调优、资源管理、存储驱动选择以及监控和日志记录等。以下是一些关键的实践方法和策略:Dockerfile优化减少层数:合并多个RUN
Linux平台Docker容器化应用的性能调优实践
2024-10-07

使用 PHP 函数的最佳实践有哪些,以实现性能优化?

php 函数性能优化最佳实践:避免创建和销毁大量对象。遵循单一职责原则。缓存结果。使用适当的算法。以上实践可有效提高应用程序响应速度和稳定性。PHP 函数性能优化最佳实践PHP 函数是构建动态和交互式 Web 应用程序的基础。本文将介绍一
使用 PHP 函数的最佳实践有哪些,以实现性能优化?
2024-05-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录