多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

微信小游戏 Unity 适配方案 iOS 高性能模式与高性能+模式实战指南

微信小游戏 Unity 适配方案 iOS 高性能模式与高性能+模式实战指南 游戏开发移动开发WebAssembly【免费下载链接】minigame-unity-webgl-transform微信小游戏Unity引擎适配器文档。项目地址https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform点击查看免费下载本文基于 Design/iOSOptimization.md 撰写系统讲解微信小游戏在 iOS 环境下的「高性能模式」与「高性能模式」为什么要开、性能提升多少、如何开通、有哪些硬性限制以及上线前必须完成的优化组合拳。读者看完即可对照自己的 Unity WebGL 小游戏项目完成 iOS 高性能模式的评估、开通、压测与避坑排障。在 iOS 环境下微信小游戏标准的 WASM 运行模式是无 JIT即时编译的对计算性能要求较高的游戏会受到明显限制中低端机帧率偏低、流畅度难以达到上线标准或者 CPU 计算资源消耗过高、运行一段时间后设备温度持续上升。小游戏环境框架为此提供了高性能运行模式在 CPU 算力上带来明显提升但同时也引入了更严格的内存与代码包体限制需要开发者采取合适的手段把效果做到最优。本文将以仓库内 iOS 优化文档为主体结合 内存优化、代码分包、压缩纹理 等配套文档给出从开通到优化的完整路径。一、背景iOS 上标准 WASM 模式的性能瓶颈在 iOS 普通模式无 JIT下Unity WebGL 小游戏通常面临两个典型问题中低端机帧率较低流畅度难以达到上线标准CPU 计算资源消耗过高运行一段时间后设备温度持续上升长时间运行容易越来越烫。这两个问题本质上是同一件事的两面标准模式下 WASM 只能解释执行算力受限游戏为了跑满逻辑只能持续占满 CPU。高性能模式正是针对这一场景提供的运行能力增强方案。二、两种高性能运行模式2.1 高性能模式高性能模式在小游戏独立进程内启用 JIT 执行 WASM 代码CPU 算力得到明显提升适用于「遇到 iOS 环境运行性能不足、运行发烫」的小游戏。该模式也意味着更严格的内存与代码包体限制详见本文第五章需要配合内存与代码体积优化才能稳定上线。2.2 高性能模式高性能模式在高性能模式基础上进一步演进在保留游戏独立进程的同时将渲染重新挪回微信进程从而改善渲染效果与渲染内存消耗。特别地以下两类游戏建议开启高性能模式使用 WebGL2 的游戏WebGL2 渲染支持说明可参考仓库内 Design/WebGL2.md内存压力大的游戏。开启后务必验证进程内存、渲染兼容性、帧耗时数据是否正常。高性能模式也能显著降低 GPU 内存是 GPU 显存压力较大游戏的重要解法详见 Design/OptimizationMemory.md 中的 QA 部分。三、性能提升实测3.1 CPU 消耗对比通过多款游戏项目实测iOS 不同执行模式下的 CPU 随时间消耗如下图所示横轴为时间纵轴为 CPU 占用比例图中对比了「普通模式」「高性能未分包」「高性能分包」三种场景可以得出三个结论高性能模式在长期执行过程中 CPU 明显低于普通模式后者长期处于高 CPU 占用因此长时间运行容易越来越烫游戏启动初始阶段高性能模式存在 CPU 高峰用于 WebAssembly 编译优化图中标注的编译优化时间与代码体积相关低档机约为 1 分钟量级采用代码分包后高性能模式能较快回落 CPU 占用并维持正常水平这直接回答了后文 QA 中为什么开启了高性能模式游戏启动很烫的问题。3.2 Benchmark 压力测试使用 Unity 所提供的 Benchmark Demo 的部分案例进行评测仓库内对应示例工程位于 Demo/BenchmarkInstantiate DestroyAnimation SkinningPhysics CubesAI Agents测试过程为不断增加运算复杂度直到帧率下降到特定数值。分数越高代表运行能力越强。下图分别为 iOS 端普通模式与高性能模式的得分可以看到在几个压测示例中高性能模式均明显优于普通模式如普通模式 Overall Score 约 6728高性能模式约 51174。不过文档同样提醒经实际游戏测试游戏帧率都会得到明显改善但无法达到 Benchmark 中几乎一个数量级的差异——Benchmark 是纯计算密集型理想场景实际游戏受渲染、加载等综合因素影响改善幅度需要以真机实测为准。四、如何开通iOS 端小游戏高性能模式适用于遇到 iOS 环境运行性能不足、运行发烫的小游戏。开通步骤如下登录微信公众平台进入能力地图 → 研发能力 → 生产提效包点击开通高性能模式。入口在「能力地图-研发能力」板块的「生产提效包」功能卡片中开通成功后通过配置小游戏项目根目录game.json的iOSHighPerformance字段为true即可进入高性能模式{ iOSHighPerformance: true }通过去掉该开关可以正常回退到普通模式方便开发者在两种模式之间切换对比。五、高性能模式的两大硬性限制高性能模式并非免费午餐它通过更苛刻的内存与代码体积约束换取算力。开发者务必明确这两条红线。5.1 内存限制机型档位代表机型RAM内存限制低端机iPhone 6s/7/8 等2G1G中高端机iPhone 7P/8P/XS/iPhone X/11/12 等3G 以上1.5G安全内存建议1.2G~1.3G开发者务必保证内存峰值不超过该数值建议根据优化 Unity WebGL 的内存的指引系统性地优化内存。理解这个限制需要先了解小游戏进程内的内存构成。以 iOS 高性能模式为例一款代码体积 30MB 的游戏对应webgl/Build/xxx.code.unityweb或code.wasm其内存占用大致为小游戏基础库约 100~150MB Canvas约 70MB与设备物理分辨率相关 编译内存约 300MB UnityHeap Gfx 显存 音频 JavaScript 内存通常 100MB其中几个关键点详见 Design/OptimizationMemory.mdWASM 编译内存Unity WebGL 把所有代码编译为跨平台 WebAssembly 二进制运行时需编译执行占用极大——iOS 上 30MB 未压缩代码约需 300MB 运行时编译内存这部分是内存大头UnityHeap由托管堆C# 托管对象、本机堆Unity Native 对象与原生插件内存如 Lua 的 malloc组成典型占用的动态内存上限需要开发者在转换面板合理预留文件系统陷阱Emscripten 用文件系统模拟 Linux/POSIX 接口代价是占用与文件同等大小的内存因此请勿使用首资源包、Addressable Cache 机制、WWW.LoadFromCacheOrDownload等 Cache API。5.2 代码体积限制高性能模式下WASM 代码将被编译并优化需要占用更多的编译消耗与内存。如果未做优化可以明显感受到启动开始阶段如启动前 1 分钟内设备发烫。上线发布时特别建议使用 WASM 代码分包 压缩纹理 UnityHeap 预留这几种优化手段。六、上线前的优化组合拳针对上述两大限制文档明确给出三条主线优化手段并配合仓库内对应文档形成完整闭环6.1 WASM 代码分包降编译内存与启动发热代码分包 采用 Profile Guided Optimization 方式按函数粒度对 WASM 代码包进行拆分将原始 wasm 拆为启动加载的主包与可延迟加载的子包。对于 iOS 高性能模式子包不会全量加载而是转为按函数粒度按需加载其核心价值在于减少内存使用支持更多 iOS 低端机运行高性能模式一般可将原编译代码内存降低 50% 以上减少编译时间降低游戏前期的发烫情况。收集与上线的经验参考值详见 WasmSplit 文档首包函数个数至少要有原始包函数总数的30%以上上线后要持续关注「新增收集函数个数」如果线上新增较多超过 50 个建议重新生成分包并提审发布。6.2 压缩纹理降 GPU 显存与 Bundle 体积压缩纹理工具 将纹理资源从 Bundle 中分离单独托管并按实际运行设备 GPU 生成 ASTC、DXT、ETC2 等多种格式按需加载降低 bundle 体积资源按需加载加快游戏运行进度有效降低内存GPU 硬件解码、渲染效率更高。如果引擎版本高于 2021可使用引擎自身的 ASTC 压缩格式低版本引擎2018~2020建议使用微信 Unity SDK 压缩纹理工具。6.3 UnityHeap 预留防止扩容尖刺UnityHeap 是存储所有状态、托管对象和本机对象的区域单帧内无法 GC、Heap 只增不减且存在内存碎片单帧内瞬间的内存峰值非常容易造成 crash。因此应在转换面板设置合理的UnityHeap 预留内存通过性能面板观察DynamicMemory峰值后设置略大于峰值可多预留 50~100MB。参考建议值超休闲游戏 256、中度游戏模拟经营、卡牌成长496、重度游戏SLG、MMO768。同时注意 UnityHeap 不宜过大——1024MB 时大部分设备将启动失败500MB 时 32 位微信约 5% 用户与 iOS 普通模式大概率启动失败。七、常见问题 QA7.1 如何判别游戏是否已经开启了高性能模式删除本地小游戏包括开发版、体验版和正式版重新进入小游戏并打开调试查看 vconsole 日志关注game start日志中的render字段为h5则为高性能模式系统和基础库要求iOS 14.0基础库 2.23.1用户占比约为 90%。不满足此要求时自动回退为普通执行方式。7.2 使用高性能模式下游戏本身是否需要做修改业务代码无需做任何调整普通模式与高性能模式可以无缝切换高性能模式下请不要在服务端设置 Cookie游戏端内会因为跨域问题读取不到 CookieAndroid 下载资源无问题而高性能模式提示资源下载失败等网络问题请参考网络通信适配中关于跨域的问题说明。7.3 iOS 报错提示未开启 gzip/br 压缩可通过微信开发者工具查看Content-Encoding是否为gzip或br工具 Network 面板如果有正确压缩可忽略这个错误问题原因由于跨域获取不到Content-Encoding头解决办法增加跨域响应头Access-Control-Expose-Headers: Content-Length, Content-Encoding7.4 资源下载提示isTrusted多半由于跨域问题导致。可通过开发者工具查看对应资源的 Response Header 是否有跨域头具体排查方法参考网络通信适配关于跨域的问题。7.5 卡在启动封面无法启动右上角打开调试重启小游戏点三次下方的 Unity logo 打开 vconsole如果出现资源访问失败但 Android 和开发者工具却可以下载则参考 7.3 关于跨域问题的解法iOS 15.4 系统出现Not implemented、Class::FromIl2CppType此为 Unity 与 iOS 15.4 的 BUG推荐使用微信提供的wasm 代码分包方案处理iOS 16.7/17.0 系统出现glGetString (GL_EXTENSIONS) - failure苹果官方已在 17.1 修复。对于未更新系统的玩家也可使用高性能模式处理。7.6 个别游戏 UI 会出现闪烁问题目前已发现iOS 15.4出现若干渲染 BUG如stencil 特性支持问题请查阅优化 Unity WebGL 的渲染性能该文档明确提醒iOS 15.4 系统使用 Stencil 可能导致渲染异常不需要时建议在 Shader 中注释掉 Stencil 相关代码如按上述文档去除依然无法解决请提供可复现的 Unity 工程联系小游戏客服助手。7.7 为什么开启了高性能模式游戏启动很烫参考本文第三章的 CPU 消耗分析如果未使用代码分包JIT 编译优化将耗费大量性能启动阶段如前 1 分钟CPU 高峰显著。使用代码分包后高性能模式能较快回落 CPU 占用并维持正常水平。7.8 使用高性能模式下不优化内存、WASM 代码包体积就发布上线可以吗不建议。iOS 高性能模式虽然能提升运行算力但对内存、WASM 包体积有更苛刻的要求需要投入更多精力做优化。如果不做任何优化很有可能会遇到超出内存限制而崩溃、启动时发烫严重等问题。上线发布时特别建议使用 WASM 代码分包 压缩纹理 UnityHeap 预留这几种优化手段。7.9 iOS 高性能模式与安卓性能对比如何两种系统环境下 WASM 执行都是 JIT 代码。但由于底层虚拟机差异过大以及自身不断迭代难以横向对比建议以各自真机实测数据为准。八、总结iOS 高性能模式为 Unity WebGL 小游戏提供 JIT 算力能显著降低长期 CPU 占用、缓解发烫Benchmark 压测显示性能数倍于普通模式高性能模式进一步将渲染挪回微信进程改善渲染效果与渲染内存适合 WebGL2 与内存压力大的游戏。开通路径为「微信公众平台 → 能力地图 → 研发能力 → 生产提效包」随后在 game.json 配置iOSHighPerformance: true即可生效去掉开关可回退对比。高性能模式的代价是更严格的内存低端机 1G、中高端机 1.5G与代码体积限制上线前务必完成WASM 代码分包 压缩纹理 UnityHeap 预留三件套优化。遇到 gzip/br 报错、isTrusted、卡启动封面、UI 闪烁等问题时可对照本文第七章的 QA 逐项排查网络类问题统一收敛到跨域配置渲染类问题收敛到渲染管线与 Stencil 使用。深入阅读Design/iOSOptimization.md、Design/OptimizationMemory.md、Design/WasmSplit.md、Design/CompressedTexture.md、Design/UsingNetworking.md、Design/RenderOptimization.md。赞分享游戏开发移动开发WebAssembly【免费下载链接】minigame-unity-webgl-transform微信小游戏Unity引擎适配器文档。项目地址https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform点击查看免费下载相关推荐微信小游戏 Unity 适配EmscriptenGLX 渲染模式接入与性能优化实战指南微信小游戏 Unity 适配EmscriptenGLX 渲染模式接入与性能优化实战指南 EmscriptenGLX 渲染模式是微信小游戏 Unity/团结引擎游戏开发移动开发WebAssembly微信小游戏 Unity 适配方案高精度时间开启指南与性能检测实战微信小游戏 Unity 适配方案高精度时间开启指南与性能检测实战 导读 在微信小游戏环境中默认的 Date.now 与 performance.now 只能游戏开发移动开发WebAssemblyGo Trace Experiments 实战指南基于 golang.org/x/exp/trace 定义、发射与恢复自定义执行追踪实验事件Go Trace Experiments 实战指南基于 golang.org/x/exp/trace 定义、发射与恢复自定义执行追踪实验事件 执行追踪exe游戏开发移动开发WebAssembly上一篇3分钟解锁B站缓存视频m4s-converter让你随时随地离线观看下一篇Finagle 全局命令行 Flag 完全指南从 JVM 参数到源码级配置解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表