Version: 1.3
语言 : 中文
AssetBundle异步Instantiate
Math库 Wasm SIMD支持

异常处理优化

游戏C#代码、Library、系统CoreLib、IL2CPP Runtime,其中都会包含比较多的异常相关代码,最终都会编译成Wasm,以Wasm的方式来进行处理,具体有两种方式:JS方式和Wasm原生方式。

JS方式下,try块中的所有函数调用,都会先跳转到JS,记录堆栈,再跳转回Wasm继续执行,无论是否实际有异常抛出都会这样,性能开销比较大。不过优点是浏览器支持比较好。

引擎之前使用的就是JS方式,并且“Enable Exceptions”设置为“None”时,并没有移除全部异常处理指令,仍然会存在JS-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。

AssetBundle异步Instantiate
Math库 Wasm SIMD支持