Version: 1.7
语言 : 中文
异步实例化
Shader变体异步Warmup

异常处理优化

在游戏开发中,C# 代码、Library、系统 CoreLib、IL2CPP Runtime 都可能涉及异常处理代码,这些代码在编译成 WebAssembly(Wasm)后,会以两种方式进行异常处理:通过 JavaScript(JS)方式Wasm 原生处理

JS 方式

在 JS 方式中,所有在 try 块内的函数调用都会先跳转到 JS 层记录堆栈信息,然后再跳转回 Wasm 继续执行。这种方式无论是否抛出异常都会增加性能开销,但其优势在于浏览器的兼容性较好。

引擎之前使用的就是 JS 方式,并且 Enable Exceptions 设置为 None 时,并没有移除全部异常处理指令,仍然会存在 JS-Wasm 跳转。

Wasm 原生方式

Wasm 原生方式下,异常会在 Wasm 内部直接处理,不会有和 JS 的反复跳转,性能较好,缺点是一些旧版本的浏览器内核没有支持。

优化措施

针对这方面问题,进行了如下优化:

  • 精简 IL2CPP 生成代码中的异常相关部分;

  • PlayerSettings 里 Enable Exceptions 设置为 None 时,彻底移除 Wasm 代码中的异常处理相关指令;

  • PlayerSettings里 Enable Exceptions 中增加 Wasm Exception 选项,支持 Wasm 原生异常处理(需要关注浏览器的支持情况);

  • 新增 Enable Exceptions Only For User Codes 选项,细化了异常的范围:

    • 当启用异常时(即 Enable Exceptions 不为 None ),勾选 Enable Exceptions Only For User Codes ,则仅对用户的 C# 代码和 Library 开启异常支持,其他部分(包括 IL2CPP Runtime、系统 CoreLib、Builtin Library)关闭异常支持;

    • 取消勾选 Enable Exceptions Only For User Codes ,或全局关闭异常时(即 Enable Exceptions 为 None ):对所有代码均开启异常支持;

设置选项位于 Project Settings -> Player -> Publish Settings

异步实例化
Shader变体异步Warmup