SpriteJS 3.0 正式发布 —— 针对可视化大屏渲染优化性能提升10倍+

时间:2024-03-23 15:18:14

SpriteJS 3.0 正式版于12月26日发布,这一版与2.x最大的区别是,2.x采用canvas2d渲染,而3.x默认采用WebGL2渲染,在不支持WebGL2的环境中会依次降级为WebGL和canvas2d。

因为使用WebGL2渲染,使得框架在利用GPU渲染和优化方面比2.x有质的突破,从而带来了性能的巨大提升。

经过初步测试,在渲染同样的精灵元素时,3.x的性能平均是2.x的2倍,这个性能优势会随着精灵数量的增多而增加,最多的情况下可以达到6-10倍。也就是说,在原本2.x下渲染fps大概15帧左右的应用,在3.x下可以达到流畅的60fps。

这个结果不仅仅是因为3.x升级渲染引擎,虽然WebGL相比于canvas2d有优势,但是仅仅渲染层面上优势并没有那么大。主要是3.x不仅升级了渲染引擎,而且针对大量元素的批量渲染从架构上做了非常多的优化,这些优化让3.x在大多数情况下,即使同时渲染数千个元素到画布上,每次刷新画面的渲染批次(即从帧缓冲到屏幕输出的次数)也只有个位数。

SpriteJS 3.0 正式发布 —— 针对可视化大屏渲染优化性能提升10倍+

SpriteJS 3.x渲染5000个精灵元素

在3.x中,当精灵元素添加到Layer上时,框架会构建它的轮廓(contours)和网格(mesh)信息,这些信息一旦被构建,会被缓存起来,除非某些属性改变触发了它们的更新,否则每次渲染可以复用这些信息。

正常情况下,当一帧开始绘制时,引擎会智能地将相邻元素的网格数据进行压缩合并。大部分情况下,元素的网格信息都可以被合并,除非存在以下三种情况:

  • 相邻元素使用了不同的纹理图片

  • 相邻元素使用了不同的滤镜特效

  • 合并渲染的网格顶点数超过了bufferSize指定的顶点数(默认是1500,可配置)

因为这种智能合并机制,使得引擎将合并后的数据一次送入GPU完成渲染,这大大提升了性能。

SpriteJS 3.x还支持组拓印Cloud这样的黑科技,利用这两种技术渲染的性能更是有十倍甚至百倍的提升。关于这部分内容,可以参考官方文档。

与旧的2.x一样,3.x同样有良好的跨平台性,除了浏览器外,可以在Node.js环境、微信小程序、微信小游戏渲染。

另外,3.x有一个2.x没有的特性,那就是支持了WebWorker,可以在Worker线程中完成渲染!

这样,在处理一些繁琐的绘制任务时,就不会卡住主线程的用户操作了。

具体使用Worker渲染的方法,可以参考官方文档。

在未来SpriteJS的定位依然是面向数据大屏可视化的图形系统渲染框架,会针对大数据渲染做更多的优化,可能会引入WebGPU和WebAssembly等技术,让图形可视化在Web渲染方面的性能不再成为瓶颈。

对可视化感兴趣的同学,可以继续关注和支持SpriteJS~

SpriteJS 3.0 正式发布 —— 针对可视化大屏渲染优化性能提升10倍+