和大家谈谈我为什么选择图形这条路(一)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 前端图形从图形的角度带你领略前端的美59篇原创内容公众号图形学这个领域目前来看是很好玩也很有前景的一个方向,当我们了解它的基础知识,get到它好玩地方的时候,我们可以很轻松延伸到可视化这一领域进行拓展。本文会尽量以很通俗很详细的方式来向大家介绍,希望读者有所收获。

目录



因为是系列篇之基础入门篇,我会先从图形基础和数学基础这两个部分开始讲起:


image.png


img


图形基础


在 Web 上,图形通常是通过浏览器绘制的。现代浏览器是一个复杂的系统,其中负责绘制图形的部分是渲染引擎。渲染引擎绘制图形的方式,一般大体上有 4 种。

image.png

image.gifimg


1. 传统的html + css


与传统的 Web 应用相比,可视化项目,尤其是 PC 端的可视化大屏展现,使用HTML 与 CSS 情景相对较少,于是可能有些人会误认为,可视化只能使用 SVG、Canvas 这些方式,不能使用 HTML 与 CSS。当然了,这个想法是不对。


其实现代浏览器的HTML、CSS 表现能力很强大,其实一些简单的可视化图表,完全可以用 CSS 来实现,比如,我们常见的柱状图、饼图和折线图。能简化开发,又不需要引入额外的库,可以节省资源,提高网页打开的速度。


image.png


img


但是使用HTML + CSS也是有一定地弊端:


1)维护麻烦,在 CSS 代码里,我们很难看出数据与图形的对应关系,有很多换算也需要开发人员自己来做。这样一来,一旦图表或数据发生改动,就需要我们重新计算,所以维护起来会很麻烦。


  1. 性能开销是非常大,HTML 和 CSS 作为浏览器渲染引擎的一部分,为了完成页面渲染的工作,除了绘制图形外,还要做很多额外的工作。比如说,浏览器的渲染引擎在工作时,要先解析 HTML、SVG、CSS,构建 DOM 树、RenderObject 树和 RenderLayer 树,然后用 HTML(或 SVG)绘图。当图形发生变化时,我们很可能要重新执行全部的工作。


那有没有更好的实现方式,当我们在重绘图像时,不会发生重新解析文档和构建结构的过程,这个当然是有的,那后面也会介绍到。

image.png

image.gifimg

2. SVG


SVG 它是浏览器支持的一种基于 XML 语法的图像格式,它的 XML 语言本身和 HTML 非常接近,都是由标签 + 属性构成的,而且浏览器的 CSS、JavaScript 都能够正常作用于 SVG 元素。


image.pngimg

3. canvas2D


接下来到了图形基础的重点,canvas2D,后续的数学基础部分也是大多数以它为基础进行绘制。


这里说一下它的声明式绘图系统和指令式绘图系统「区别」:


1)声明式绘图系统:我们根据数据创建各种不同的图形元素(或者 CSS 规则),然后利用浏览器渲染引擎解析它们并渲染出来。


2)指令式绘图系统:它更多的是浏览器提供的一种可以直接用代码在一块平面的画布上绘制图形的api,使用它来绘图更像是传统的“编写代码”,简单来说就是调用绘图指令,然后引擎直接在页面上绘制图形。


总结来说,如下面图所示,像Canvas 能够直接操作绘图上下文,不需要经过 HTML、CSS 解析、构建渲染树、布局等一系列操作。因此单纯绘图的话,Canvas 比 HTML/CSS 和 SVG 要快得多、在重绘图像时,也不会发生重新解析文档和构建结构的过程,开销要小很多。

image.png

image.gifimg


4. WebGL


这里webGL我们也不作为重点,这里我们简单说一下其使用场景:


第一种情况,如果我们要绘制的图形数量非常多,比如有多达数万个几何图形需要绘制,而且它们的位置和方向都在不停地变化,如果使用 Canvas2D 绘制,性能是会达到瓶颈的。这个时候,我们就需要使用 GPU 能力,直接用 WebGL 来绘制。

第二种情况,如果我们要对较大图像的细节做像素处理,比如,实现物体的光影、流体效果和一些复杂的像素滤镜。由于这些效果往往要精准地改变一个图像全局或局部区域的所有像素点,要计算的像素点数量非常的多(一般是数十万甚至上百万数量级的),我们也要用 WebGL 来绘制。


第三种情况是绘制 3D 物体。因为 WebGL 内置了对 3D 物体的投影、深度检测等特性,所以用它来渲染 3D 物体就不需要我们自己对坐标做底层的处理了。那在这种情况下,WebGL 无论是在使用上还是性能上都有很大优势。

image.png


image.gifimg


要使用 WebGL 绘图,我们必须要深入细节里,换句话说就是,我们必须要和内存、GPU 打交道,真正控制图形输出的每一个细节。


数据经过CPU(中央处理单元,负责逻辑计算)处理,成为具有特定结构的几何信息。然后,信息会被送到GPU(图形处理单元,负责图形计算)中进行处理。在GPU中要经过两个步骤生成光栅信息(构成图像的像素矩阵),这些光栅信息会输出到帧缓存(一块内存地址)中,最后渲染到屏幕上。


GPU 是由大量的小型处理单元构成的,它可能远远没有 CPU 那么强大,但胜在数量众多,可以保证每个单元处理一个简单的任务。即使我们要处理一张 800 * 600 大小的图片,GPU 也可以保证这 48 万个像素点分别对应一个小单元,这样我们就可以同时对每个像素点进行计算了。


image.png


img


这里注意一下,图里红框框住的Default levels。里面按照严重的级别排序分别为:


Verbose(详细),Info(信息),Warnings(警告),Error(错误)。我们可以通过下拉框的选择搭配Filter的功能来对控制台打印的信息进行筛选。



相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
6月前
|
前端开发 JavaScript API
如何实现两栏布局?这篇文章告诉你所有的细节!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
3月前
|
数据可视化 搜索推荐 Python
如何用mplfinance打造与众不同的K线图?红涨绿跌背后的实现原理!
【8月更文挑战第21天】在金融市场分析中,K线图是洞察市场动态的关键工具。Python的mplfinance库专为金融数据可视化设计,能高效绘制K线图。针对中国交易者习惯,需将上涨设为红色,下跌为绿色。首先安装mplfinance库,然后准备股票数据。使用自定义颜色函数配合`make_marketcolors`方法实现红涨绿跌效果。此设置让图表更直观,有助于快速把握市场趋势,同时mplfinance的强大功能支持进一步个性化图表。
157 0
|
5月前
技术经验分享:1.1显函数的图形
技术经验分享:1.1显函数的图形
20 0
|
6月前
|
数据可视化 测试技术 uml
【掌握绘图艺术】用PlantUML绘制完美UML图表,开发者的福音
【掌握绘图艺术】用PlantUML绘制完美UML图表,开发者的福音
1243 1
|
前端开发
渐变是真的好玩,真是一个有趣的特性
css 渐变是一种特殊的 image 格式,使用 gradient 表示, gradient 属于 image 的子集,用于表示渐变的 image , gradient 的语法如下
123 0
|
开发者 Python
绘图细节设置2|学习笔记
快速学习绘图细节设置2
134 0
绘图细节设置2|学习笔记
|
开发者 Python
绘图细节设置1|学习笔记
快速学习绘图细节设置1
113 0
绘图细节设置1|学习笔记
|
编解码 数据可视化 API
Qt开发技术:图形视图框架(一)基本介绍
Qt开发技术:图形视图框架(一)基本介绍
Qt开发技术:图形视图框架(一)基本介绍
|
前端开发 数据可视化 JavaScript
和大家谈谈我为什么选择图形这条路(二)
数学基础 img 1.1 坐标系与向量之以canvas为例实现坐标系的转换 这里首先我要先从对坐标系进行转换进行讲起,那为什么我要先讲坐标系的转换问题:因为转换坐标系对于图形学绘制而言,实在太重要了,后续所有图形的绘制都要用到这个思想,具体为什么我们先从一个之前前面看到的图形讲起: 首先经过一顿坐标点换算,我们得出每个点具体的坐标(这里我用了一个Rough.js的库,绘制一个手绘风格的图像),最终算出山顶的坐标就是 (-80, 100) 和 (80, 100),山脚的坐标就是 (-180, 0)、(20, 0)、(-20, 0)、(180, 0),太阳的中心点的坐标就是 (0, 150)。 i
和大家谈谈我为什么选择图形这条路(二)