20个值得收藏的WebGL性能优化技巧

news2024/11/26 8:49:44

WebGL 是一项功能强大的技术,允许开发人员使用基于 OpenGL ES 图形标准的 WebGL API 在 Web 浏览器中创建 3D 图形。 然而,由于在 Web 环境的限制下实时渲染 3D 图形的复杂性,优化 WebGL 性能可能具有挑战性。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

1、使用 Three.js 并优化 WebGL

Three.js 是一个流行的 JavaScript 库,用于在 WebGL 中创建 3D 图形,它具有自己的一组优化功能,可以帮助提高 WebGL 性能。 最重要的是,与其他图形引擎相比,Three.js 应用程序开发成本极具竞争力。 这是与 Three.js 明确相关的附加点:

  • 优化 Three.js 渲染调用:Three.js 提供了高效渲染 3D 场景的管道。 但是,过多的渲染调用会影响性能。 要优化 Three.js 中的渲染调用,请使用视锥体剔除等技术,其中涉及确定哪些对象在相机的视锥体中可见,并仅渲染这些对象。
  • Three.js 提供了对视锥体剔除的内置支持,你可以通过将要进行视锥体剔除的对象的 frustumCulled 属性设置为 true 来启用它。 此外,还可以使用visible属性来控制对象的可见性并防止隐藏对象的不必要的渲染。
  • 使用对象池:Three.js 对象(例如几何图形、材质和纹理)的创建和销毁成本可能很高。 Three.js 开发人员获得了对对象池的内置支持,他们可以使用 poolify 等库或实现自己的对象池逻辑来优化性能。
  • 使用细节级别 (LOD):细节级别 (LOD) 是一种根据距相机的距离使用具有不同细节级别的 3D 对象的不同版本的技术。 Three.js 提供对 LOD 的内置支持,你可以使用 THREE.LOD 类在场景中创建 LOD 对象。
  • 使用纹理图集:纹理图集是包含多个较小纹理的大型纹理图像。 纹理图集可以帮助减少纹理交换次数并提高 WebGL 性能。 Three.js 通过其 THREE.TextureLoader 和 THREE.Texture 类提供对纹理图集的支持。 你可以手动创建纹理图集,也可以使用第三方工具(例如TexturePacker)为你的 Three.js 应用程序生成纹理图集。

2、优化你的 WebGL 代码

编写高效且优化的代码是优化 WebGL 性能的第一步。 这包括优化着色器,即在 GPU 上运行以计算 3D 对象外观的程序。 以下是优化着色器的一些技巧:

  • 保持简单:使用简单的数学运算并避免不必要的计算。 尽可能简化计算,减少 GPU 的工作负载。
  • 使用内置函数:WebGL 为常见运算提供内置函数,例如矩阵乘法、向量运算和三角函数。 这些内置函数通常在硬件中实现,并且比用着色器代码编写的自定义函数更快。
  • 最小化纹理查找:纹理查找的性能代价可能很高。 使用纹理图集最大限度地减少着色器中的纹理查找数量,该纹理集将多个纹理组合成单个纹理,或者使用程序纹理而不是预先生成的纹理。
  • 优化数据流:使用所有着色器调用都可以访问的统一变量和常量,将数据从 CPU 传递到 GPU。 对于可以在 CPU 上预先计算的数据,避免使用每个顶点不同的属性和变量。

3、使用高效的渲染技术

渲染是将 3D 模型转换为可以在屏幕上显示的 2D 图像。 可以使用多种渲染技术来优化 WebGL 性能:

  • 视锥体剔除:视锥体剔除是一种仅涉及渲染视锥体内可见对象的技术,视锥体是相机视图中可见的 3D 场景的部分。
  • 细节级别 (LOD) 渲染:LOD 渲染是一种根据对象与相机的距离使用不同细节级别的技术。 距离相机较远的对象可以以较低的细节级别进行渲染,以减少需要处理的几何体数量并提高性能。
  • 遮挡剔除:这可以使用 z 缓冲或分层遮挡剔除等技术来实现,从而减少透支量并提高性能。
  • 实例化:实例化是一种涉及使用单个绘制调用渲染同一对象的多个实例的技术,这可以显着减少渲染大量对象的开销。

4、使用纹理压缩

纹理是 3D 图形的重要组成部分,因为它们提供了对象的视觉细节。 然而,纹理会消耗大量内存和带宽,从而影响 WebGL 性能。 纹理压缩是一种可以帮助优化纹理的内存使用和带宽要求的技术。

WebGL 支持多种纹理压缩格式,例如 ETC1、ETC2 和 ASTC,这些格式可以减小纹理的大小,而不会显着影响其视觉质量。 以下是在 WebGL 中使用纹理压缩的一些技巧:

  • 选择正确的纹理压缩格式:不同的纹理压缩格式在压缩率、视觉质量以及与各种设备和浏览器的兼容性方面有不同的权衡。 根据适用性选择理想的纹理压缩格式。
  • 使用 Mipmap:Mipmap 是预先生成的较低分辨率版本的纹理,可在渲染距相机不同距离的对象时使用。 Mipmap 可以改进纹理过滤并减少锯齿伪影,从而提高视觉质量和性能。
  • 最小化纹理尺寸:使用尽可能最小尺寸的纹理来实现所需的视觉质量。 较大的纹理需要更多的内存和带宽,这可能会影响性能。

5、优化渲染状态

渲染状态是控制 WebGL 如何渲染对象的设置,例如混合、深度测试和模板测试。 优化渲染状态可以通过减少渲染期间所需的 GPU 处理量来提高性能。 以下是一些提示:

  • 最小化状态变化:通过将具有相似渲染状态的对象分组并按顺序渲染它们,最小化渲染期间状态变化的数量。
  • 使用背面剔除:背面剔除是一种不渲染背向相机的对象面的技术。 这可以减少需要处理的几何体数量并提高性能。 尽可能启用背面剔除。
  • 使用延迟渲染:延迟渲染是一种将对象渲染到多个渲染目标中的技术,稍后可以使用这些目标来执行复杂的光照计算。 延迟渲染可以减少渲染过程中所需的光照计算次数并提高性能。
  • 使用早期深度测试:早期深度测试是一种涉及在渲染管道中尽早执行深度测试的技术。 这可以减少不必要的片段着色器执行量并提高性能。 尽可能启用早期深度测试。
  • 使用批量渲染:批量渲染是一种技术,涉及将具有相似属性(例如材质或纹理)的对象分组在一起,并在单个绘制调用中渲染它们。 这可以减少CPU-GPU通信和状态变化的开销,从而提高性能。

6、结束语

应用这些优化可以帮助你在 WebGL 应用程序中实现流畅、高效、具有视觉吸引力的图形渲染。 请记住始终测试和测量 WebGL 应用程序的性能,以确定需要改进的领域并相应地应用适当的优化。


原文链接:20个WebGL性能优化技巧 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序修改数据,input不能实时回显

场景: 填写发票抬头,填写抬头公司时候,会根据用户输入的内容实时获取相关的公司信息,用户选择搜索出来的公司,这时候 setData,但是数据并没有回显,而是需要再需要点一下屏幕。 解决方案: 原来…

8月24-25日上课内容 第三章 MySQL索引、事务与存储引擎

本章结构 索引介绍 1、索引的概念 索引就是一种帮助系统能够快速查询信息的结构 2、索引的作用 设置索引之后查询速度变快,当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度 加快表与表之间连接 降低数据库的IO成本 创建唯一索引来保证…

【dart】dart基础学习使用(一):变量、操作符、注释和库操作

前言 学习dart语言。 注释 Dart 支持单行注释、多行注释和文档注释。 单行注释 单行注释以 // 开头。Dart 编译器将忽略从 // 到行尾之间的所有内容。 void main() {// 这是单行注释print(Welcome to my Llama farm!); }多行注释 多行注释以 /* 开始,以 / 结…

KubeFlow组件介绍

kubeflow是一个胶水项目,它把诸多对机器学习的支持,比如模型训练,超参数训练,模型部署等进行组合并已容器化的方式进行部署,提供整个流程各个系统的高可用及方便的进行扩展部署了 kubeflow的用户就可以利用它进行不同的…

合并两个有序的单链表,合并之后的链表依然有序

定义节点 class ListNode {var next: ListNode _var x: Int _def this(x: Int) {thisthis.x x}override def toString: String s"x>$x" } 定义方法 class LinkedList {var head new ListNode(0)def getHead(): ListNode this.headdef add(listNode: Li…

省级专精特新!祝贺旭帆科技荣获安徽省“专精特新”中小企业!

2023年8月,安徽旭帆信息科技有限公司(以下简称“旭帆科技”)成功荣获2023年度“安徽省专精特新中小企业”荣誉称号,成为具备专业化、精细化、特色化、新颖化的“专精特新”企业。 随着《“十四五”促进中小企业发展规划》的深入实…

mysql 查看 、设置缓冲池 buffer_pool

Mysql 存储引擎 MyIsam 和 Innodb 引擎 myIsam 存储引擎: 只缓存索引,不缓存数据,对应的键缓存参数为 key_buffer_size show variables like ‘key_buffer_size’; set global key_buffer_sizexxxx; 或者 my.ini my.cnf [server] key_buffer…

二三维电子沙盘数字沙盘虚拟现实开发教程第14课

二三维电子沙盘数字沙盘开发教程第14课 很久没有写了,主要前段时间在针对怎么显示高精度的 倾斜数据而努力,现在终于实现了效果不错。以前的版本显示倾斜数据控制不太好。 对了。目前系统暂只支持smart3d生成的kml格式的数据,由专有的录入程…

教你如何做正交表

正交表是一种用于多因素实验设计的表格。它可以帮助我们在尽可能少的试验次数下确定各个因素对结果的影响,从而提高实验效率。接下来将从以下几个方面介绍正交表的相关内容。 一、正交表基本概念 正交表是一种特制的表格,用于多因素实验设计研究。根据正…

马蹄集oj赛(第十次)

目录 2的N次幂 升级版斐波那契数列 个数统计 个数统计2 大斐列 AB problem ​编辑 A-B problem 快速幂 进行一个幂的运算 整数大小比较 2的N次幂 难度:黄金 0时间限制:1秒 巴占用内存:128M 任意给定一个正整数N(N≤100)&#xff0…

Qt6 for Windows 环境搭建(Visual Studio)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 Windows 中,如果想要开发 Qt 应用程序,可以选择多种方式: Qt Creator MinGW 编译器Qt Creator MSVC 编译器Visual Studio&#xff0…

线上祭奠软件:虚拟纪念与情感表达的新方式

线上祭奠软件作为一种新兴的技术应用,正在改变传统祭奠方式,为人们提供了跨越时空的虚拟纪念和情感表达方式。本文将深入探讨线上祭奠软件的意义、功能与挑战,并思考其对社会和个人的影响。 一、线上祭奠软件的意义: 1.跨…

MyBatis —— 初窥门径

前言 MyBatis作为一款优秀的持久层框架,在Java后端开发中无疑是比较重要一环,在常见的spring整合的SSM框架以及之后的SpringBoot中都可以看到MyBatis大显神威的模样。在这篇文章中,荔枝将会从Maven开启创建一个MyBatis项目并整理MyBatis相应的…

服务器放在香港好用吗?

​  相较于国内服务器,将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案,因此更无备案时限,购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…

函数注解学习

def hanshuzhujie(a:str,b: str m)->str:print(hanshuzhujie.__annotations__)return ab hanshuzhujie(qqq)运营结果 E:\Python\Python38\python.exe D:/pythonprojects/python-auto-test/test/hanshuzhujie.py {a: <class str>, b: <class str>, return: <…

生态项目|Typus如何用Sui特性制作动态NFT为DeFi赋能

对于许多人来说&#xff0c;可能因其涉及的期权、认购和价差在内的DeFi而显得晦涩难懂&#xff0c;但Typus Finance找到了一种通过动态NFT使体验更加丰富的方式。Typus NFT系列的Tails为用户带来一个外观逐渐演变并在平台上提升活动水平时获得新特权的角色。 Typus表示&#x…

AI时代,GPGPU和NPU哪个才是王者?

AI飞速发展&#xff0c;全球算力井喷&#xff0c;我国进入AI计算高速发展阶段&#xff0c;GPU的自主化已经摆上案头。近日&#xff0c;华夏银行首席信息官吴永飞发表研究&#xff0c;指出GPGPU是比NPU更合适的路线&#xff0c;并以海光DCU为基础进行了GPU算力池化的研究。 GPG…

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…

说说我最近筛简历和面试的感受。。

大家好&#xff0c;我是鱼皮。 都说现在行情不好、找工作难&#xff0c;但招人又谈何容易&#xff1f;&#xff01; 最近我们公司在招开发&#xff0c;实习社招都有。我收到的简历很多&#xff0c;但认真投递的、符合要求的却寥寥无几&#xff0c;而且都是我自己看简历、选人…

【ES6】Proxy的高级用法,实现一个生成各种 DOM 节点的通用函数dom

下面的例子则是利用get拦截&#xff0c;实现一个生成各种 DOM 节点的通用函数dom。 <body> </body><script>const dom new Proxy({}, {get(target, property) {return function(attrs {}, ...children) {const el document.createElement(property);for …