跳到主要内容

WebGL:纹理、网格、批次与绘制调用

依据:官方文档与本站教学拆解|环境:WebGL 通用原理;目标 API 与扩展依设备而定|真机:未验证

一个看似二维的图标,在 WebGL 中可以是两个三角形组成的矩形,附带纹理坐标和颜色。GPU 按顶点位置生成覆盖区域,再由片元着色器为这些区域计算颜色。使用引擎时,大部分底层工作由引擎管理,但理解它能帮助判断性能边界。

图片怎样贴到三角形上​

网格保存位置等顶点数据,UV 决定从纹理哪里取颜色,Shader 定义如何计算输出,绘制调用把相关状态交给 GPU。透视并不是必须的:正交投影就能组织普通的 2D UI。WebGL 也不会自动给这个矩形增加按钮事件。

一个二维精灵由两组三角形、UV 和纹理采样得到最终图像

图片资源被上传为纹理,往往会在多帧间复用。频繁创建、上传或销毁资源与单纯移动对象的成本不同;只看画面上的对象数无法解释全部开销。

合批为什么会被打断​

兼容的对象可以由引擎组织为更少的绘制调用,但合批需要满足相应条件。纹理、材质、混合、裁剪或顺序变化都可能形成边界。透明对象还经常需要保持正确的覆盖顺序,因此不能为了少一次调用任意重排。

相同纹理与材质的对象可连续批绘,中间的遮罩或材质变化会形成边界

一次绘制也不一定轻。一个覆盖全屏的复杂 Shader 可能对大量像素执行计算;多个半透明全屏层还会反复处理同一区域。相反,较多的小绘制有时主要受 CPU 提交开销影响。优化前应区分 CPU、GPU、资源上传和内存压力。

失败案例:只盯着 draw call 数量​

为了把统计数字压低而把大量资源塞入巨大图集,结果启动变慢、纹理驻留增加,未必有益。另一种错误是把发光滤镜铺满屏幕,却因调用数很少就认为“很轻”。需要在代表性设备上同时观察帧时间、纹理与内存、加载过程和最复杂场景。

版本与平台边界​

WebGL 1、WebGL 2、扩展支持与目标微信运行环境不能混写成一个“支持 WebGL”。使用特定纹理格式、渲染目标或 Shader 功能时,应记录具体版本与能力检查;图形上下文丢失后,应用也需要正确恢复资源。引擎提供了封装,仍不能替代发布平台验证。

理解到这里就足够进入Shader。日常 UI 开发通常先使用引擎提供的 Sprite、Label、Mask 等组件,再根据测量结果处理批次和材质。

来源​

Khronos WebGL 1.0 规范提供管线与状态定义;Cocos UI 合批说明引擎层的批次组织条件。本站批次图为概念示意,不是任何项目的实测调用记录。