在浏览器中实现可视化的四种方式一句话,可视化本质上就是将数据信息组织起来,并以图形化的方式呈现出来。在Web上,图形通常是通过浏览器绘制的。现代浏览器是一个复杂的系统,负责绘制图形的部分就是渲染引擎。渲染引擎绘制图形一般有四种方式。第一种是传统的HTML+CSS。该方法通常用于渲染普通网页。第二种是使用SVG。SVG和传统的HTML+CSS绘图方式没有太大区别。但是HTML元素绘制矢量图的能力有些不足,而SVG恰好弥补了这一不足。第三种是使用Canvas2D。这是浏览器提供的CanvasAPI中的context之一,可以很方便的绘制基本的几何图形。第四种是使用WebGL。这是浏览器提供的CanvasAPI中的另一个上下文,是OpenGLES规范的Web端实现。通过它,我们可以用GPU渲染各种复杂的2D和3D图形。值得一提的是,WebGL利用了GPU的并行处理特性,这使得它在处理大量数据时比前三种绘图方式要好很多。因此,在可视化应用中,对于一些数据量大、视觉效果要求高的特殊场景,使用WebGL渲染是更合适的选择。方法一:HTML+CSS可视化项目,尤其是PC端的大屏可视化,与传统的Web应用相比,不仅使用的HTML和CSS更少,而且使用方式也不同。所以有同学会认为可视化只能用SVG和Canvas,不能用HTML和CSS。当然,这种想法是错误的。具体原因是什么?我一起看看。事实上,现代浏览器的HTML和CSS表现能力非常强大,完全可以实现常规的图表展示,比如我们常见的直方图、饼图、折线图等。使用CSS实现一些简单的可视化图表是非常有益的,不仅可以简化开发,而且不需要引入额外的库,可以节省资源,提高打开网页的速度。了解CSS的绘制思路,对于可视化也很有帮助。比如CSS的很多理论都是和视觉相关的,在可视化方面可以借鉴。缺点:HTML和CSS是浏览器渲染引擎的一部分。为了完成页面渲染工作,除了绘制图形外,还必须做很多额外的工作。例如,浏览器的渲染引擎在工作时,首先解析HTML、SVG和CSS,构建DOM树、RenderObject树和RenderLayer树,然后用HTML(或SVG)进行绘制。当图形发生变化时,我们很可能要重新执行所有的工作,这样的性能开销是非常大的。而且传统的web开发涉及到UI构建和内容组织,所以这些额外的解析和构建工作是必须要做的。与传统网页不同,可视化不需要复杂的布局,更多的工作在绘图和数据计算上。因此,对于可视化来说,这些额外的任务相当于白白消耗了性能。方法二:SVG现代浏览器都支持SVG(ScalableVectorGraphics,可缩放矢量图形)。SVG是一种基于XML语法的图像格式,可以通过图像(img元素)的src属性加载。更重要的是,浏览器更强大,因为它还可以嵌入SVG标签,并使用DOMAPI像普通HTML元素一样操作SVG元素。甚至,CSS可以应用于嵌入式SVG元素。SVG绘制图表的方式与HTML和CSS绘制图表的方式没有太大区别,只是将HTML标签替换为SVG标签,并使用了一些SVG支持的特殊属性。HTML的缺点是HTML元素的形状一般都是矩形。虽然借助CSS也可以画出其他各种形状的图形,甚至是不规则的图形,但总的来说还是很麻烦。而SVG弥补了这一不足,使得不规则图形的绘制变得更加容易。因此,用SVG绘图比HTML和CSS方便得多。然而,SVG图表也有缺点。在渲染引擎中,SVG元素和HTML元素一样,需要经过引擎解析、布局计算和渲染树生成后才能输出图形。而且,一个SVG元素只表示一个基本图形。如果显示的数据比较复杂,生成图形的SVG元素就会很多。这样,大量的SVG元素不仅会占用大量内存空间,还会增加引擎、布局计算和渲染树生成的开销,降低性能,拖慢渲染速度。这意味着SVG只适用于元素较少的简单可视化场景。方法三:除了SVG,Canvas2D也很方便使用Canvas2D上下文绘制可视化图表,但是在绘制方式上,Canvas2D与HTML/CSS和SVG有些不同。无论是使用HTML/CSS还是SVG,都属于声明式绘图系统,即??我们根据数据创建各种图形元素(或CSS规则),然后使用浏览器渲染引擎对其进行解析和渲染。但是Canvas2D不同。它是浏览器提供的一种API,可以直接使用代码在平面“画布”上绘制图形。用它画图更像是传统的“写代码”。简单来说就是调用绘图指令,引擎直接在页面上绘制图形。这是一个命令式绘图系统。那么Canvas是如何绘制可视化图表的呢?让我们来看看。首先,Canvas元素在浏览器上创建一个空白画布,使我们能够通过提供渲染上下文来绘制内容。然后,我们只需要调用渲染上下文,设置各种属性,然后调用绘图指令完成输出,就可以在画布上呈现各种图形了。为了实现更复杂的效果,Canvas还提供了非常丰富的设置和绘图API,我们可以通过操作context来改变填充和描边的颜色,在canvas上进行几何变换,调用各种绘图指令,然后绘制图形输出画布。综上所述,Canvas可以直接操作绘图上下文,无需经过HTML、CSS解析、构建渲染树、布局等一系列操作。所以对于纯绘图,Canvas比HTML/CSS和SVG快得多。这里需要注意一点,Canvas和SVG的使用不是非此即彼,它们是可以结合使用的。因为SVG是一种图形格式,所以它也可以作为图像元素绘制到Canvas中。比如我们可以先用SVG生成一些图形,然后用Canvas渲染。这样,我们既可以享受SVG的便捷,也可以享受Canvas的高性能。方式四:WebGL一般来说,Canvas2D绘制图形的性能已经足够高了,但是这三种情况我们都需要直接操作更强大的GPU来实现绘制。第一种情况,如果我们要绘制的图形数量非常多,比如要绘制的几何图形有几万个,而且它们的位置和方向都在不断变化,那么即使我们用Canvas2D来绘制,性能还是会达到瓶颈。这时候我们就需要借助GPU的能力,直接用WebGL进行绘制。第二种情况,如果我们想对一个较大的图像做细节的像素处理,比如实现物体的光影、流体效果和一些复杂的像素滤镜。由于这些效果往往需要精确地改变图像全局或局部区域的所有像素,因此需要计算的像素数量非常大(通常在数十万甚至数百万量级)。这时候即使使用Canvas2D操作也会达到性能瓶颈,所以我们不得不使用WebGL来绘制。第三种情况是绘制三维对象。因为WebGL内置了3D物体的投影、深度检测等特性,用它来渲染3D物体不需要我们自己做坐标的底层处理。在这种情况下,WebGL无论是在使用上还是在性能上都具有很大的优势。总结一下HTML+CSS的优点就是方便,没有第三方依赖,连JavaScript代码都没有。如果我们要绘制少量的普通图表,可以直接使用HTML和CSS。它的缺点是CSS属性不能直观的反映数据,绘制起来比较麻烦。复杂的图形会导致很多HTML元素,消耗性能。SVG是对HTML/CSS的增强,弥补了HTML绘制不规则图形的能力。它通过属性设置图形,可以直观地反映数据,使用起来非常方便。但是SVG也有和HTML/CSS一样的问题。当图形比较复杂时,需要的SVG元素过多,性能消耗很大。Canvas2D是浏览器提供的一个简单快速的教学图形系统,可以通过一些简单的指令快速绘制出复杂的图形。由于直接操作绘图上下文,没有HTML/CSS和SVG绘图因元素数量多而消耗性能,性能比前两者快很多。但是如果需要绘制的图形过多,或者处理大量的像素计算时,Canvas2D还是会遇到性能瓶颈。WebGL是浏览器提供的一个强大的图形系统。它使用起来很复杂,但功能强大。它可以充分利用GPU的并行计算能力,快速准确地对图像的像素点进行运算,同时完成数十万或数十万张图像。数以千计的计算。此外,它还内置了对3D物体投影、深度检测等处理,更适合绘制3D场景。
