WebGL图形编程实战【6】:性能优化 × 调试工具与技巧精讲
调试工具
NVIDIA Nsight Systems
NVIDIA Nsight Systems 这个工具帮助开发者深入了解应用程序在CPU、GPU 和网络通信等各个层面的运行情况,从而有效地识别性能瓶颈并进行优化
WebGL-Inspector
插件的地址在这:WebGL-Inspector chrome插件
但是在这里已经无法下载,在chrome商店里面没有,在其GitHub仓库 WebGL-Inspector 也没有找到。
然后在 百度网盘 找到一个下载地址。下载下来的crx扩展文件直接拖拽安装的时候报错了,这时可以将crx改为zip压缩文件。然后再解压,然后在chrome://extensions/里面找到刚刚解压的目录,点击加载已解压扩展程序安装即可。
调试说明:可以用这个水族馆或者拿一个webgl写的案例来试一下。打开目标网页之后,点击刚才安装的插件,如果没有弹出下面的弹框,再点击右上角绿色的UI图标就会弹出这个框了。
WebGL-Inspector 是一个用于调试和分析 WebGL 应用程序的浏览器插件,它的调试工具可以帮助开发者深入理解 WebGL 渲染管线的运行状态、资源使用情况和性能表现。以下是各个调试工具的作用和含义:
1. Trace(调用追踪)
- 作用:记录 WebGL API 的调用历史。
- 功能:
- 按时间顺序显示所有 WebGL 函数调用(如
gl.drawElements
,gl.bindBuffer
等)。 - 可以查看调用参数、返回值以及上下文状态的变更。
- 支持跳转到代码触发位置(若浏览器支持)。
- 按时间顺序显示所有 WebGL 函数调用(如
- 用途:
- 调试渲染错误时,定位具体的 WebGL 调用步骤。
- 检查冗余的 API 调用(如重复绑定纹理或缓冲区)。
- 分析代码逻辑是否符合预期。
2. TimeLine(时间线)
- 作用:可视化 WebGL 渲染性能。
- 功能:
- 显示每一帧的渲染时间、资源加载时间、GPU 耗时等。
- 标注关键事件(如
drawCall
、texture upload
等)。 - 支持逐帧分析,观察性能波动。
- 用途:
- 定位性能瓶颈(如过多的绘制调用或过大的纹理上传)。
- 优化帧率(FPS),确保渲染流畅性。
3. State(状态查看器)
- 作用:实时监控 WebGL 上下文的状态参数。
- 功能:
- 显示当前启用的 WebGL 状态(如
BLEND
、DEPTH_TEST
、CULL_FACE
等)。 - 查看状态参数(如混合函数
blendFunc
、深度测试阈值depthRange
等)。 - 对比不同时刻的状态变化。
- 显示当前启用的 WebGL 状态(如
- 用途:
- 调试渲染错误(如因状态未正确设置导致的显示异常)。
- 确认渲染管线配置是否符合预期(例如混合模式或深度测试是否开启)。
4. Texture(纹理查看器)
- 作用:管理当前 WebGL 上下文中的所有纹理。
- 功能:
- 列出所有已创建的纹理(包括尺寸、格式、过滤模式等元数据)。
- 预览纹理内容(支持放大/缩小查看像素细节)。
- 分析纹理内存占用。
- 用途:
- 检查纹理是否正确加载(如 UV 翻转、格式错误)。
- 优化纹理内存(如发现未销毁的冗余纹理)。
- 调试纹理采样问题(如过滤模式或 MIPMAP 配置错误)。
5. Buffers(缓冲区查看器)
- 作用:管理顶点缓冲区(VBO)、索引缓冲区(IBO)等。
- 功能:
- 显示缓冲区类型(
ARRAY_BUFFER
、ELEMENT_ARRAY_BUFFER
等)、大小和使用次数。 - 查看缓冲区数据的原始内容(如顶点坐标、颜色、UV 等)。
- 检查顶点属性指针(
vertexAttribPointer
)的配置。
- 显示缓冲区类型(
- 用途:
- 确认顶点数据是否正确上传。
- 调试因缓冲区绑定错误导致的渲染问题(如模型缺失或错乱)。
- 优化内存使用(如复用缓冲区或删除无效缓冲区)。
6. Programs(着色器程序查看器)
- 作用:管理 WebGL 着色器程序(Shader Program)。
- 功能:
- 列出所有已编译的着色器程序及其关联的顶点/片段着色器。
- 显示着色器源码、编译日志和错误信息。
- 查看 Uniform 和 Attribute 变量的值及类型。
- 支持编辑并重新编译着色器(部分插件支持热重载)。
- 用途:
- 调试着色器语法错误或逻辑错误。
- 检查 Uniform 变量是否传递正确(如矩阵或光照参数)。
- 优化着色器性能(如减少复杂计算或冗余变量)。
WebGL lint
WebGL lint 是一个脚本,您可以将其放入 WebGL 项目中,以检查常见的 WebGL 错误。
可以直接通过script标签引入或者通过import引入
<script src="https://greggman.github.io/webgl-lint/webgl-lint.js" crossorigin></script>;import 'https://greggman.github.io/webgl-lint/webgl-lint.js';
就像这样,引入了webGL-lint之后我不小心将draw放在了设置着色器变量之前调用了,这个时候就会报错:uniforms "proj" have not been set
类型化数组
提升webGL效率
数据方面(数据组织)
绘制一个带有颜色的三角形,我们通常需要定义两个数组,然后再读取数据传到着色器代码当中。
- 顶点坐标xyz数组
- 颜色数组
但是在CPU和GPU在读写数据的时候,会消耗大量的时间,所以尽量减少数据的读写次数,尽量减少数据在CPU和GPU之间的传输。所以在前面我们通常在数据融合在同一个数组当中,再通过vertexAttribPointer去取偏移量。
webGL.vertexAttribPointer(aPsotion, 4, webGL.FLOAT, false, 8 * 4, 0);
webGL.vertexAttribPointer(aColor, 4, webGL.FLOAT, false, 8 * 4, 4 * 4);
绘制方面(可视化)
核心在于drawArray和drawElements(调用的次数越少、性能越高)
退化三角形:表面上看起来是在绘制三角形,但是当webGL正要绘制的时候发现提供的顶点无法绘制,webGL会检测并且删除该三角形
不同的绘制方法消耗的性能
在webGL当中绘制平面都是基于三角形来绘制的,现在假设需要绘制8个三角形,然后有三个绘制三角形的API和两个绘制方法。其中顶点坐标用Float32Array类型,index数用Uint16Array类型。
- Float32Array需要4个字节,Uint16Array需要2个字节
drawArray | drawElements | |
---|---|---|
绘制三角形API | 不需要index索引数组 | 需要index索引数组 |
TRIANGLES 三角形 | 8个三角形,每个三角形需要3个顶点 24 * 4 * 4 = 384 | 只需要九个不同的顶点以及3*8个索引位置 9 * 4 * 4 + 24 * 2 = 192 |
TRIANGLE_FAN 三角扇 | 上面需要6个点、下面也是6个点外加中间连接的两个点 (6 + 6 + 2) * 4 * 4 = 224 | 同样的需要九个顶点但是只需要14个索引位置 9 * 4 * 4 + 14 * 2 = 172 |
TRIANGLE_STRIP 三角带 | 同上 | 同上 |
总结:这是一个只包含8个三角形的小网格,而且只考虑了顶点位置,所以需要的内存相对来说还算小。
如果面对的是一个很的网格,而且还需要包括法线和纹理坐标,则使用drawElements()方法+TRIANGLE_STRIP图元的组合可以节省更多的内存。重要的是,不要毫无必要地浪费内存,但是从性能角度来看,内存并不是唯一重要的因素。从性能角度来看,三角形绘制的顺序以及项点数据的组织形式也是很重要的因素。
相关文章:
WebGL图形编程实战【6】:性能优化 × 调试工具与技巧精讲
调试工具 NVIDIA Nsight Systems NVIDIA Nsight Systems 这个工具帮助开发者深入了解应用程序在CPU、GPU 和网络通信等各个层面的运行情况,从而有效地识别性能瓶颈并进行优化 WebGL-Inspector 插件的地址在这:WebGL-Inspector chrome插件 但是在这里…...
69、微服务保姆教程(十二)容器化与云原生
容器化与云原生 在微服务架构中,容器化和云原生技术是将应用程序部署到生产环境的核心技术。通过容器化技术,可以将应用程序及其依赖项打包成一个容器镜像,确保在任何环境中都能一致运行。而云原生技术则通过自动化的容器编排系统(如 Kubernetes),实现应用的动态扩展、自…...
CSS3(BFC)
CSS3(BFC) 1、什么是BFC W3C 上对 BFC 的定义: 原文:Floats, absolutely positioned elements, block containers (such as inline-blocks, table- cells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other tha…...
OrangePi Zero 3学习笔记(Android篇)7 - ftdi_sio
目录 1. 内核配置 2. SPI设备 3. 验证 这部分需要基于之前修改的ftdi_sio驱动,增加MPSSE部分的代码。 1. 内核配置 一般默认USB转串口是关闭的,所以需要配置打开。在源代码根目录下执行: ./longan/build.sh menuconfig 菜单进入顺序&a…...
自适应蒙特卡洛定位-AMCL
自适应蒙特卡洛定位,简称AMCL,主要提供定位功能并以/tf形式输出 蒙特卡洛算法的基本思想:当所要求的问题是某种事件出现的概率或者是某个变量的期望值时,它们可以通过某种"试验"的方法,得到这种事件出现的概…...
用python清除PDF文件中的水印(Adobe Acrobat 无法删除)
学校老师发的资料,有时候会带水印,有点强迫症的都想给它去掉。用Adobe Acrobat试了下,检测不到水印,无法删除!分析发现原来这类PDF文件是用word编辑的,其中的水印是加在了页眉中! 自己动手想办法…...
bootstrap自助(抽样)法
一,概念 一言以蔽之:从训练集中有放回的均匀抽样——》本质就是有放回抽样; 自助法(bootstrap)是一种通过从数据集中重复抽样来估计统计量分布的非参数方法。它可用于构建假设检验,当对参数模型的假设存在…...
综合实验二之删除/boot目录,进行系统修复
实验三、删除/boot目录,进行系统修复 在 Linux 系统中,/boot 目录是一个至关重要的系统目录,主要用于存放系统启动时所需的核心文件和配置信息。 /boot 目录的主要作用: 存放内核文件(Kernel) vmlinuz&…...
postgresql主从集群一键搭建脚本分享
脚本1: cat pg_ms_install.sh #!/bin/bash # 基础环境配置(保持不变) setenforce 0 >/dev/null 2>&1 || true sed -i "s/SELINUXenforcing/SELINUXdisabled/" /etc/selinux/config systemctl stop firewalld >/dev/n…...
融合一致性与差异性约束的光场深度估计
摘要:光场图像深度估计是光场三维重建、目标检测、跟踪等应用中十分关键的技术。虽然光场图像的重聚焦特性为深度估计提供了非常有用的信息,但是在处理遮挡区域、边缘区域、噪声干扰等情况时,光场图像深度估计仍然存在很大的挑战。因此&#…...
转运机器人可以绕障吗?
在工业物流场景中,障碍物动态分布、路径突发拥堵是常态。传统AGV依赖固定轨道或磁条,面对复杂环境时往往“束手无策”。转运机器人可以绕障吗?富唯智能用技术创新给出答案——搭载激光SLAM导航与多传感器融合技术,其转运机器人不仅…...
【Web前端开发】CSS基础
2.CSS 2.1CSS概念 CSS是一组样式设置的规则,称为层叠样式表,用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制,实现美化页面的效果,也能够做到页面的样式和结构分离。 2.2基本语法 通常都是ÿ…...
【物流开单专用软件】佳易王物流管理系统:常见的物流信息系统以及软件程序实操教程 #物流软件定制#物流软件开发#物流软件推荐
一、概述 软件试用版资源文件下载方法: 【进入头像主页第一篇文章最后 卡片按钮 可点击了解详细资料 或左上角本博客主页 右侧按钮了解具体资料信息】 本实例以 佳易王物流管理系统 为例说明,其他版本可参考本实例。试用版软件资源可到文章最…...
力扣-94.二叉树的中序遍历
题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 class Solution { public:void inorder(TreeNode* root, vector<int>& res){//C这里&一定要加if(!root)return;inorder(root->left,res);res.push_back(root->val);inorder(ro…...
对基于再生龙制作的Linux系统的硬盘进行扩容
背景 公司一个仪器产品是基于x86核心板开发的,因此制作系统镜像时用的再生龙软件,好处是制作的系统镜像比ARM平台那种raw image小很多,缺点是操作有点麻烦。 最近客户反馈512GB的SSD硬盘容量不够,因此公司决定升级成1TB的&#x…...
Spring Boot 注解详细解析:解锁高效开发的密钥
一、引言 Spring Boot 以其快速开发、自动配置等特性,成为构建 Java 应用程序的热门框架。而注解在 Spring Boot 中扮演着至关重要的角色,它们如同魔法指令,简化了配置流程,增强了代码的可读性与可维护性。本文将深入剖析 Spring…...
【速写】KV-cache与解码的再探讨(以束搜索实现为例)
文章目录 1 Beam Search 解码算法实现2 实现带KV Cache的Beam Search解码3 关于在带kv-cache的情况下的use_cache参数 1 Beam Search 解码算法实现 下面是一个使用PyTorch实现的beam search解码算法: 几个小细节: 束搜索可以加入length_penalty&#…...
ElasticSearch聚合操作案例
1、根据color分组统计销售数量 只执行聚合分组,不做复杂的聚合统计。在ES中最基础的聚合为terms,相当于 SQL中的count。 在ES中默认为分组数据做排序,使用的是doc_count数据执行降序排列。可以使用 _key元数据,根据分组后的字段数…...
微信小程序单双周选择排序有效果图
效果图 .wxml <view class"group-box"><label class"radio" wx:for"{{[单周,双周,全选]}}" wx:key"index" bind:tap"radioChange"data-index"{{index}}"><radio checked"{{index zcTem.ind…...
保持Word中插入图片的清晰度
大家有没有遇到这个问题,原本绘制的高清晰度图片,插入word后就变模糊了。先说原因,word默认启动了自动压缩图片功能,分享一下如何关闭这项功能,保持Word中插入图片的清晰度。 ①在Word文档中,点击左上角的…...
Matlab 基于GUI的汽车巡航模糊pid控制
1、内容简介 Matlab 225-基于GUI的汽车巡航模糊pid控制 可以交流、咨询、答疑 2、内容说明 略 依据比例—积分—微分控制的基本原理,我们利用MATLAB软件中SMULINK建立一个简单的PID控制器模型,利用这个模型在模糊控制过程中对PID控制参数进行在线的实时…...
(网络)应用层协议-HTTPS
1.HTTPS是什么? HTTPS是应用层的一种协议,是在HTTP的基础上进行了加密层的处理。 HTTP协议的内容都是按照文本的形式进行传输的,所以呢就很容易被别人知道传输的是什么。 我们在了解了TCP/IP之后是知道我们的数据在传输的过程中是通过路由器进…...
Browserless 快速上手
要将你提供的 HTML 模板和数据结构转换为可以用于 Browserless /pdf 接口的 JSON 请求体(且能正确渲染为 PDF),需要满足以下几点: ✅ 最终目标格式(这是能用的格式): json 复制编辑 { "h…...
JWT的介绍与在Fastapi框架中的应用
什么是JWT JWT (JSON Web Token) 是一个开放标准 ( RFC 7519 ),它定义了一种紧凑且自包含的方式,用于在各方之间安全地以 JSON 对象的形式传输信息。由于这些信息经过数字签名,因此可以被验证和信任。JWT 可以使用密钥(采用HMAC算…...
Html5新特性_js 给元素自定义属性_json 详解_浅克隆与深克隆
文章目录 1. html5新特性2.用 js 给元素自定义属性3.json3.1 json与普通对象的区别3.2 json对象与 js对象的转化 4.浅克隆和深克隆 1. html5新特性 html5中引入了新的特性(新的标签),下面的新标签是新的结构标签,不过不太常用 h…...
一般纯软工程学习路径
基础 阶段一:基本熟悉工具链代码托管流程和配置 代码托管基本 1. 成见和管理代码库(组) 2. 成员配置和权限配置 代码迁移 1. 手工迁移 2. 脚本自动化迁移 代码提交 1. SSH key配置 2. 代码提交commit message 管理需求单 MR合并请求 1. 合并请…...
ES6基础特性
1.定时器 ——延时定时器 setTimeout(function()>{ },2000) ——间隔执行定时器 setInterval(function()>{ },2000) *定时器方法都返回唯一标识编号id&…...
SSTI记录
SSTI(Server-Side Template Injection,服务器段模板注入) 当前使用的一些框架,如python的flask、php的tp、java的spring,都采用成熟的MVC模式,用户的输入会先进入到Controller控制器,然后根据请求的类型和请求的指令发…...
Go语言爬虫系列教程(一) 爬虫基础入门
Go爬虫基础入门 1. 网络爬虫概念介绍 1.1 什么是网络爬虫 网络爬虫(Web Crawler),又称网页蜘蛛、网络机器人,是一种按照一定规则自动抓取互联网信息的程序或脚本。其核心功能是模拟人类浏览网页的行为,通过发送网络…...
c/c++爬虫总结
GitHub 开源 C/C 网页爬虫探究:协议、实现与测试 网页爬虫,作为一种自动化获取网络信息的强大工具,在搜索引擎、数据挖掘、市场分析等领域扮演着至关重要的角色。对于希望深入理解网络工作原理和数据提取技术的 C/C 开发者,尤其是…...
【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南
【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南 一、前言 碰一碰分享的定义 在 HarmonyOS NEXT 系统中,华为分享推出的碰一碰分享功能,为用户带来了便捷高效的跨端分享体验。开发者通过简单的代码实现,就能调用系统 API 拉起分享卡片模板&…...
vue H5解决安卓手机软键盘弹出,页面高度被顶起
开发中安卓机上遇到的软键盘弹出导致布局问题 直接上代码_ 在这里插入代码片 <div class"container"><div class"appContainer" :style"{height:isKeyboardOpen? Heights :inherit}"><p class"name"><!-- 绑定…...
【pypi镜像源】使用devpi实现python镜像源代理(缓存加速,私有仓库,版本控制)
【pypi镜像源】使用devpi实现python镜像源代理(缓存加速,私有仓库,版本控制) 文章目录 1、背景与目标2、devpi-server 服务端搭建3、devpi 镜像源使用 1、背景与目标 背景1(访问速度优化): 直…...
Spring Bean有哪几种配置方式?
大家好,我是锋哥。今天分享关于【Spring Bean有哪几种配置方式?】面试题。希望对大家有帮助; Spring Bean有哪几种配置方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Bean的配置方式主要有三种ÿ…...
无人机信号线被电磁干扰导致停机
问题描述: 无人机飞控和电调之间使用PWM信号控制时候,无人机可以正常起飞,但是在空中悬停的时候会出现某一个电机停机,经排查电调没有启动过流过压等保护,定位到电调和飞控之间的信号线被干扰问题。 信号线被干扰&am…...
RWA开发全解析:技术架构、合规路径与未来趋势
RWA开发全解析:技术架构、合规路径与未来趋势 ——2025年真实世界资产代币化的创新逻辑与实践指南 一、RWA的核心定义与爆发逻辑 1. 什么是RWA? RWA(Real World Asset Tokenization)是通过区块链技术将现实资产(房地…...
消息队列作用及RocketMQ详解(1)
目录 1 什么是消息队列 2 为什么要使用消息队列 2.1 异步处理 2.2 解耦 2.3 削峰填谷 3. 如何选择消息队列? 4. RocketMQ 4.1 生产者 4.2 消费者 4.3 主题 4.4 NameSever 4.5 Broker 5. 生产者发送消息 5.1 普通消息发送 5.1.1 同步发送 5.1.2 异步发送 5…...
DICOM 网络服务实现:医学影像传输与管理的技术实践
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
恰到好处TDR
了解我的人都知道我喜欢那些从 1 到 10 到 11 的东西。对于那里的年轻人,参见 Spinal Tap,1984 年。但是有没有把它调得太高这样的事情呢?我收到并回答了很多关于使用时域反射仪 (TDR) 进行测量的问题。 我需要多少带宽…...
kubernetes服务自动伸缩-VPA
实验环境 安装好k8s集群 一、准备工作 1、部署Metrics Server VPA 依赖 Metrics Server 来获取 Pod 的资源使用数据。首先需要部署 Metrics Server 下载地址(需要连接VPN):wget https://github.com/kubernetes-sigs/metrics-server/relea…...
stm32之BKP备份寄存器和RTC时钟
目录 1.时间戳1.1 Unix时间戳1.2 UTC/GMT1.3 时间戳转换**1.** time_t time(time_t*)**2.** struct tm* gmtime(const time_t*)**3.** struct tm* localtime(const time_t*)**4.** time_t mktime(struct tm*)**5.** char* ctime(const time_t*)**6.** char* asctime(const stru…...
OSCP - Hack The Box - Sau
主要知识点 CVE-2023-27163漏洞利用systemd提权 具体步骤 执行nmap扫描,可以先看一下55555端口 Nmap scan report for 10.10.11.224 Host is up (0.58s latency). Not shown: 65531 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp o…...
C++色彩博弈的史诗:红黑树
文章目录 1.红黑树的概念2.红黑树的结构3.红黑树的插入4.红黑树的删除5.红黑树与AVL树的比较6.红黑树的验证希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 红黑树是一种自平衡二叉查找树,每个节点都带有颜色属性,颜色或为…...
14.three官方示例+编辑器+AI快速学习webgl_buffergeometry_instancing_interleaved
本实例主要讲解内容 这个Three.js示例展示了如何结合使用索引几何体、GPU实例化和交错缓冲区来高效渲染大量相同模型的不同实例。通过这种技术组合,我们可以在保持较低内存占用的同时渲染数千个独立变换的对象。 核心技术包括: 索引几何体的实例化渲染…...
「华为」人形机器人赛道投资首秀!
温馨提示:运营团队2025年最新原创报告(共210页) —— 正文: 近日,【华为】完成具身智能赛道投资首秀,继续加码人形机器人赛道布局。 2025年3月31日,具身智能机器人头部创企【千寻智能&#x…...
GitHub 趋势日报 (2025年05月11日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型,一键生成高清短视频使用…...
MySQL查询优化100条军规
概述 以下是MySQL查询优化的关键军规,分为不同类别,帮助您系统化提升数据库性能资料已经分类整理好,喜欢的朋友自取:https://pan.quark.cn/s/f52968c518d3 一、索引优化 为WHERE、JOIN、ORDER BY字段建索引联合索引遵循最左前缀…...
WEBSTORM前端 —— 第3章:移动 Web —— 第1节:平面转换、渐变
目录 一.平面转换 二.平面转换 – 平移 ①属性 ②取值 ③技巧 三.平移实现居中效果 四.案例——双开门效果 五.平面转换 – 旋转 ①属性 ②技巧 六.平面转换 – 改变转换原点 ①属性 ②取值 七.案例-时钟 八.平面转换 – 多重转换 九.平面转换 – 缩放 ①属性 …...
1.10-数据传输格式
1.10-数据传输格式 在对网站进行渗透测试时,使用目标服务器规定的数据传输格式来进行 payload 测试非常关键 如果不按规定格式发送数据,服务器可能直接拒绝请求或返回错误响应,比如: 接口要求 JSON 格式,而你用的是…...
Python制作Dashboard【待续】
运行环境:jupyter notebook (python 3.12.7)...