纯学习资料)
还是先搞个stat.js 比什么都重要每一行一个drawcall所以每一行都重要大概截图如上入门推荐关键是“超重” “超载”文章最后页提供了很多学习链接如果非要排序或者选一个选官方的肯定是没用的*选中文的很难选推荐Timmy 的,只是介绍了入门操作和一些入门优化建议如建议3. Performance debugging with Spector.JSPerformance debugging with Spector.JS不过看了没什么用Caustic 焦散具体案例 核心信息一次超重的绘制调用plaindrawElements: TRIANGLES, 240000 indices, UNSIGNED_SHORT, 0这是整段信息的核心表格参数含义TRIANGLES绘制三角形240000 indices使用了24 万个索引UNSIGNED_SHORT索引数据类型是 16 位无符号整数0从索引缓冲区的第 0 个位置开始换算一下24 万索引 ÷ 3每个三角形 3 个顶点8 万个三角形。这是一个非常重的单次绘制通常意味着在渲染一个高面数模型或者是一个大规模的地形/场景批次。 顶点数据布局Draw Call 前设置plainbindBuffer: ARRAY_BUFFER, WebGLBuffer - ID: 1 vertexAttribPointer: 0, 3, FLOAT, false, 0, 0 bindBuffer: ELEMENT_ARRAY_BUFFER, WebGLBuffer - ID: 0表格调用解读ARRAY_BUFFER绑定到 Buffer ID 1顶点数据位置、法线、UV 等存在这里vertexAttribPointer: 0, 3, FLOAT...顶点位置属性attribute location 0• 3 个分量 vec3•FLOAT 浮点数•false 不归一化• 最后两个0, 0 紧密排列stride 0, offset 0ELEMENT_ARRAY_BUFFER绑定到 Buffer ID 0索引数据存在这里说明这里只显示了 location 0位置实际可能还有法线、UV 等其他属性在之前的调用里设置只是截图没截到。 纹理状态4 张纹理同时采样plainactiveTexture: TEXTURE0 activeTexture: TEXTURE1 activeTexture: TEXTURE2 activeTexture: TEXTURE3这个 Shader 同时使用了4 个纹理单元0~3典型的 PBR/复杂材质组合可能是表格纹理单元常见用途TEXTURE0Diffuse / Albedo基础颜色TEXTURE1Normal Map法线TEXTURE2Roughness / Metallic粗糙度/金属度TEXTURE3AO / Emissive / Lightmap环境光遮蔽/自发光/光照贴图 前后两次绘制对比截图里能看到几乎相同的调用序列出现了两次但有两处关键差异差异 1Uniform 开关变化plain// 第一次 uniform1f: WebGLUniformLocation - ID: 3, true ... // 第二次 uniform1f: WebGLUniformLocation - ID: 3, false同一个 UniformID: 3从true1.0变成了false0.0。这很可能是一个布尔开关比如u_isHighlighted是否高亮u_useAlphaTest是否开启 Alpha 测试u_isFrontFace正面/背面标记u_receiveShadow是否接收阴影差异 2正面朝向翻转plain// 第一次 frontFace: CCW (Counter-Clockwise, 逆时针为正面) // 第二次 frontFace: CW (Clockwise, 顺时针为正面)这是面剔除Face Culling的设置。两次绘制之间把正面定义翻转了常见原因渲染双面材质先画正面CCW再画背面CW镜像/反射物体矩阵缩放为负值时三角形的环绕方向会反转不同的模型批次两次 draw call 属于不同的模型一个模型导出时面朝向不一致参考学习资料 官方资源必看1. Spector.js 官方 GitHub 文档地址GitHub - BabylonJS/Spector.js: Explore and Troubleshoot your WebGL scenes with ease. · GitHub内容安装说明、API 文档、扩展使用指南、独立版本集成重点看documentation/extension.md和documentation/standalone.md2. Real Time Rendering 官方教程作者亲笔文章Debugging WebGL with SpectorJS作者Sebastien VandenbergheSpector.js 的创建者Babylon.js 核心贡献者内容从安装到高级用法最完整的官方 walkthrough包括基础捕获流程捕获视图详解Init/End State、Context 信息、帧信息如何对比两次捕获代码中驱动扩展captureNextFrame、setMarker等独立版本使用 实战博客3. Performance debugging with Spector.JS作者Timmy Kokke地址Performance debugging with Spector.JS内容WebXR/WebGL 性能调试实战包含扩展安装和激活流程在特定场景点捕获帧选择 Draw Call 进行深度分析4. Debugging WebGL — DevTools, Spector.js Profiling地址Debugging WebGL — DevTools, Spector.js Profiling |…内容综合性教程约 40 分钟涵盖gl.getError()基础调试WEBGL_debug_renderer_info获取 GPU 信息Spector.js 帧捕获与检查Chrome GPU Timeline 性能分析Draw Call 优化技巧程序化集成 Spector.jsCDN 引入、捕获回调 扩展阅读WebGL 调试全景5. WebGL Debugging and Profiling Tools 综述原文https://www.realtimerendering.com/blog/webgl-debugging-and-profiling-tools/中文翻译博文阅读密码验证 - 博客园内容WebGL 调试工具全景图包括WebGL Inspector你之前尝试的那个Chrome Canvas InspectorGoogle Web Tracing Framework (WTF)WebGL Report查看浏览器 WebGL 能力6. Khronos 官方 WebGL 调试工具地址GitHub - KhronosGroup/WebGLDeveloperTools · GitHub内容webgl-debug.js官方库可以包装 WebGL context 自动检查gl.getError()记录每个 WebGL 函数调用到控制台x.只能说国内的武林功夫都不教真的How We Profile WebXR/WebGL Apps 建议的学习路径表格阶段做什么预计时间第 1 步跟着 Real Time Rendering 官方教程走一遍完整流程30 分钟第 2 步打开一个 Three.js 示例页面自己捕获一帧逐个点开 Draw Call 看20 分钟第 3 步看 Timmy Kokke 的博客学习在性能瓶颈点捕获15 分钟第 4 步看 mysimulator 的综合教程了解 Draw Call 优化和 Chrome GPU Timeline40 分钟第 5 步在自己的项目里用spector.setMarker()标记关键渲染阶段按需 一个快速上手练习打开这个 Three.js 官方示例three.js examples点击 Spector 图标 → 等变绿 → 点击捕获在结果面板里左侧找到gl.drawElements或gl.drawArrays点击看右侧的Texture标签 → 看到立方体的纹理点击Program标签 → 看到顶点/片段着色器源码点击Uniforms→ 看到 MVP 矩阵的实时值这样走一遍比看十篇文档都管用。需要我针对某个具体场景比如 Three.js、Babylon.js、或者你自己的项目给更详细的调试建议吗无厘头参考2011 年Android学习系列(5)--App布局初探之简单模型http://www.cnblogs.com/qianxudetianxia/archive/2011/04/29/2033057.html