- 游戏开发
- 移动开发
- WebAssembly
【免费下载链接】minigame-unity-webgl-transform
微信小游戏Unity引擎适配器文档。
导读
本文基于微信小游戏 Unity/团结引擎适配方案(minigame-unity-webgl-transform)的 WebGL2.0 渲染支持说明,系统梳理 WebGL2.0 在微信小游戏环境中的适用场景、用户占比现状、已知兼容问题与解决方案。读者在掌握本文后,可以判断自己的 Unity WebGL 游戏是否有必要启用 WebGL2.0,能正确配置导出选项,并能在 iOS 高性能模式下规避 GPU Instancing 闪烁、DrawMeshInstanced 显示错乱等典型坑点。
一、WebGL2.0 是什么:与 WebGL1.0 的能力边界
WebGL 是用于在 Web 浏览器中渲染图形的 API,其功能基于 OpenGL ES 图形库。两者的大致对应关系为:
- WebGL 1.0≈OpenGL ES 2.0
- WebGL 2.0≈OpenGL ES 3.0
Unity WebGL 的较多渲染优化特性都依赖 WebGL2.0,例如 GPU Instancing、SRP Batcher、线性颜色空间、URP 后处理等,因此微信小游戏适配方案专门针对该特性做了支持说明。当前仓库中 RenderOptimization.md 对两者关系做了进一步补充:
- WebGL2.0基本兼容WebGL1.0,但并不是完全向后兼容;
- 对 Unity 而言,WebGL1.0 与 WebGL2.0 生成的 Shader 不一样,各有优缺点。WebGL2.0 使用Uniform Buffer管理
UnityPerDraw和UnityPerMaterial属性,Unity 内置 Shader 有大量游戏可能用不到的冗余属性;而 WebGL1.0 会用不到的材质属性会被剔除; - 并非用 WebGL2.0 性能就一定比 WebGL1.0 好,有条件的话建议分别打包对比帧率、CPU 利用率与内存使用。
适合使用 WebGL2.0 的场景
根据游戏项目统计,相比 WebGL1,以下游戏需求更适合 WebGL2.0:
| 场景 | 说明 |
|---|---|
| 线性颜色空间渲染 | 目前 Unity 只有在 WebGL2.0 下才支持线性颜色空间,WebGL1.0 必然是 Gamma 颜色空间 |
| GPU Instancing 提高渲染性能 | 实例化合并 Draw Call,属于 WebGL2.0 特性 |
| SRP Batcher 提高渲染性能 | 减少渲染状态切换,Unity 2021 以上 + WebGL2.0 两个先决条件 |
| URP PostProcessing 提升品质 | URP 管线的后处理能力 |
| 依赖 OpenGL ES 3.0+ Shader | 存在大量难以降级到 ES 2.0 的 Shader |
如果游戏内容不多、材质比较简单、不依赖 GPU Instancing 等 WebGL2.0 特性,那么 WebGL1.0 也足够(参考 RenderOptimization.md)。
二、微信小游戏环境的 WebGL2.0 支持现状与用户占比
Unity WebGL 较多渲染优化特性依赖 WebGL2.0,因此需要针对该特性在小游戏环境的支持情况加以说明。官方统计(数据截至 2022.12)如下:
- Android 平台:小游戏基础库8.0.24(2022 年中版本)起已支持 WebGL2,当时用户占比> 85%。最新占比请查阅微信官方基础库版本分布。
- iOS 高性能模式:需要 iOS 系统版本>= 15.0,当时用户占比> 75%。
- iOS 高性能+模式:可以支持 iOS 系统版本>= 14.0的用户使用 WebGL2。
其中"高性能+模式"是微信小游戏环境框架提供的能力,它在保留游戏独立进程的基础上将渲染重新挪回微信进程,从而改善渲染效果与渲染内存消耗。当前仓库的 iOSOptimization.md 明确建议:使用 WebGL2、内存压力大的游戏开启此选项,开启后需要验证进程内存、渲染兼容性、帧耗时数据是否正常。
三、已知兼容问题与规避策略
3.1 总述
- iOS 高性能模式下使用 WebGL2 会存在较多问题,平台暂不保证所有能力完善,开发者务必验证游戏所用到的特性的支持情况。
- 对于 WebGL2,高性能+模式有更好的兼容性。
- 如遇到问题可联系我们详细排查。
此外,仓库 CompressedTexture.md 提到微信纹理压缩已支持 WebGL2.0 模式下的 Gamma 与 Linear 颜色空间渲染(Beta),但仅支持 2019、2020、2021 三个年限中部分 Unity 版本,开发者使用后需进行详细真机测试。
3.2 iOS 高性能模式开启 GPU Instancing:模型闪烁 / 消失 / 不绘制
- 原因:iOS WebKit 对 WebGL2 的支持存在问题,当uniform 变量过多时,会出现绘制不正确、不绘制、效率变低等现象。
- 解决方法:
- 减少 Shader 中 Instance Props 的大小;
- 在 Shader 中添加
instancing_options选项(可参考 Unity 官方文档《GPU instancing shader》说明):assumeuniformscaling:开启后,默认 object 缩放为均匀缩放,uniform 可以减少sizeof(mat4x4) * instance count的大小;forcemaxcount:batchSize:限制每次 draw call 的 instance 数量。
- 根据机型分级,使用 GPU Instancing 特性或合批处理。已知iPhone 7p 及以下机型需要进一步限制 instance count。
3.3 iOS 高性能模式 DrawMeshInstanced 显示错乱
- 原因:iOS WebKit 对 WebGL2 的支持存在问题,当批次较大时出现显示错误。
- 解决方法:iOS 上降低
DrawMeshInstanced的参数matrices数量,count 设置为 32 或更小的值。
3.4 补充:WebGL2 + URP 的 Shader 编译报错
仓库 DevelopmentQAList.md 记录了一个配套问题:使用 WebGL2 URP 管线导出小游戏时,可能提示Hidden/Universal/CoreBlit: invalid pass index 1 in DrawProcedural。有部分官方 URP 自带的 Shader 存在该问题,在微信开发者工具上可能渲染异常,一般真机上渲染正常。两种处理办法:
- 升级 URP 版本(部分 URP 版本与 Unity 版本绑定,此时可能需要同步升级 Unity 版本);
- 将工程
Library/PackageCache目录下的com.unity.render-pipelines.universal@xxx包拷贝到本地,通过file方式引入,然后修改Shaders/Utils/CoreBlit.shader,只保留第一个 Pass(注意需确保项目中只使用第一个 Pass)。
四、如何开启 WebGL2.0:导出配置与工程实践
4.1 通过导出面板配置
在 Unity 顶部菜单栏选择"微信小游戏 -> 转换小游戏"的导出流程中(详见 Transform.md),"调试编译选项"一类包含Webgl2(WebGL2.0)开关,勾选即可在转换产物中启用 WebGL2.0 渲染。
4.2 通过 MiniGameConfig.asset 配置
WebGL2 开关也对应导出配置文件Assets/WX-WASM-SDK-V2/Editor/MiniGameConfig.asset中的字段(配置字段总览见 AssetDescription.md):
// 调试编译选项 DevelopBuild -- Development Build AutoProfile -- Autoconnect Profiler ScriptOnly -- Scripts Only Build profilingFuncs -- Profiling Funcs Webgl2 -- WebGL2.0 // bool,勾选后导出 WebGL2.0 渲染产物 DeleteStreamingAssets -- DeleteStreamingAssets即CompileOptions下的Webgl2(bool 类型)。开发者可直接修改该配置文件后调用WXEditorWindow.DoExport()集成到自己的构建系统(参考 Transform.md):
var win = new WXEditorWindow(); win.DoExport();4.3 启用 WebGL2.0 后的渲染优化配合
结合 RenderOptimization.md 的建议,启用 WebGL2.0 后可以从以下方向挖掘收益:
- 尽量使用GPU Instancing实例化合并 Draw Call;
- URP 默认开启SRP Batcher,它并不减少 Draw Call 数量,而是减少渲染状态切换。如果渲染状态较多,SRP Batcher 收益会比较明显,建议开发者实测对比帧率、CPU 利用率和内存使用;
- 对于相同尺寸的纹理,可考虑合并成Texture2D Array;
- 注意线性颜色空间会让 Unity 多一个全屏 Gamma 矫正 Pass,对性能有比较明显的影响(该问题在 Unity 2021.3.23 仍存在),因此除非是 PBR 光照,否则建议选择 Gamma 颜色空间。
五、QA 小结与真机验证建议
针对 WebGL2.0 的使用,开发者在实际接入时应重点关注:
- 先评估必要性:只有依赖线性颜色空间、GPU Instancing、SRP Batcher、URP 后处理或 ES 3.0+ Shader 时才需要 WebGL2.0;
- 关注目标用户占比:Android 需基础库 >= 8.0.24;iOS 高性能模式需系统 >= 15.0;iOS 高性能+模式可放宽到 >= 14.0;
- iOS 必做真机验证:iOS 高性能模式 + WebGL2 存在较多已知问题,务必逐一验证 GPU Instancing 与 DrawMeshInstanced 等特性;遇到闪烁/消失/不绘制时,优先按本文 3.2、3.3 节的手段缩减 uniform 与批次规模;
- 优先考虑高性能+模式:其对 WebGL2 兼容性更好,并建议配合验证进程内存、渲染兼容性与帧耗时数据;
- 遇到其他问题可查阅仓库相关文档:渲染性能优化、iOS 高性能模式说明、常见问题 QA,或联系我们详细排查。
参考文档
- Unity 官方文档——WebGL 图形(原文档引用)
- 本仓库:WebGL2.0 渲染支持说明、渲染性能优化建议、MiniGameConfig.asset 配置说明、转换工具导出微信小游戏、iOS 高性能与高性能+模式、常见问题 QA、压缩纹理说明
- WebGL 规范:WebGL1.0 spec、WebGL2.0 spec
- 游戏开发
- 移动开发
- WebAssembly
【免费下载链接】minigame-unity-webgl-transform
微信小游戏Unity引擎适配器文档。
相关推荐
微信小游戏 Unity WebGL 渲染性能优化实战指南
微信小游戏 Unity WebGL 渲染性能优化实战指南 本文围绕微信小游戏 Unity WebGL 适配方案下的渲染性能优化,系统梳理 WebGL1.0/2.
游戏开发移动开发WebAssemblyGo Trace Experiments 实战指南:基于 golang.org/x/exp/trace 定义、发射与恢复自定义执行追踪实验事件
Go Trace Experiments 实战指南:基于 golang.org/x/exp/trace 定义、发射与恢复自定义执行追踪实验事件 执行追踪(exe
游戏开发移动开发WebAssembly微信小游戏 Unity 适配:EmscriptenGLX 渲染模式接入与性能优化实战指南
微信小游戏 Unity 适配:EmscriptenGLX 渲染模式接入与性能优化实战指南 EmscriptenGLX 渲染模式是微信小游戏 Unity/团结引擎
游戏开发移动开发WebAssembly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考