Unity性能调优手册11PlayerSettings:脚本运行环境,代码裁剪

翻译自https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible/

PlayerSettings

脚本运行环境

Unity允许您在Mono和IL2CPP之间进行选择,作为Android和Standalone (Windows, macOS, Linux)等平台的脚本后端。我们建议选择IL2CPP,性能会有所提高。
在这里插入图片描述

此外,将脚本后端更改为IL2CPP也将更改c++可选择“Compiler Configuration 编译器配置”。
在这里插入图片描述

在这里,您可以在Debug、Release和Master之间进行选择,每一个都在构建时间和优化程度之间进行权衡,因此最好使用最适合您的构建目标的那个。

Debug

调试在运行时表现不佳,因为没有执行优化,但与其他设置相比,构建时间最短。

Release

优化提高了运行时性能,减少了构建的二进制文件的大小,但增加了构建时间。
手游项目使用的是Release

Master

平台可用的所有优化都已启用。例如,Windows构建将使用更积极的优化,如链接时间代码生成(LTCG)。
作为回报,构建时间将比发布设置更长,但Unity建议在可接受的情况下使用Master设置进行生产构建。

Strip Engine Code / Managed Stripping Level

Strip Engine Code剥离引擎代码是一个Unity功能,允许你设置托管剥离Level来自通过编译c#生成的CIL字节码,并且期望通过分别删除未使用的代码来减少构建的二进制文件的大小。
但是,由于确定是否使用给定代码非常依赖于代码中没有直接引用的类型,或者在反射中动态调用的代码,可能会被错误地删除。
在这种情况下,使用link.xml文件或指定Preserve属性。* 1
*1 https://docs.unity3d.com/2020.3/Documentation/Manual/ManagedCodeStripping.html
译者增加部分
对于lua调用C#,主要会被代码剪裁影响,这时你可以配置ReflectionUse(不要配LuaCallSharp),执行“Generate Code”,这时不会对该类生成封装代码,而是生成link.xml把该类配置为不剪裁。
手游项目中使用
在这里插入图片描述

Accelerometer Frequency (iOS)

这是一个ios特有的设置,允许你改变加速度计的采样频率。默认设置为60hz,请根据实际情况调整频率。如果您不使用加速度计,请确保禁用该设置。
在这里插入图片描述

### Unity 热更新代码静态方法裁剪的实现方式 在 Unity 的构建过程中,特别是使用 IL2CPP 作为脚本后端时,可能会发生未使用的类或方法被裁剪的情况。为了防止这种情况的发生,可以采用一些特定的技术手段来确保必要的代码不会被移除。 #### 静态方法保留策略 当涉及到热更新逻辑时,通常会定义一系列静态方法用于初始化或其他关键操作。然而,由于这些方法可能并未直接在运行时被用,因此会被化器视为无用而删除。解决这一问题的方法之一是在代码中引入一种机制,使编译器能够识别到这些方法的存在并将其保留下来。 以下是几种常见的解决方案: 1. **通过显式用来标记方法** 可以创建一个专门的静态方法,在此方法内部用所有需要保留的静态函数。即使该方法本身不需要实际执行,也可以起到通知编译器的作用。 ```csharp public class HotUpdateManager { public static void InitializeHotUpdateMethods() { DummyCallForRetention(); } private static void DummyCallForRetention() { MethodA(); MethodB<int>(); MethodC<string, float>(); } // 假设这是需要保留的静态方法 public static void MethodA() { /* 方法 A */ } public static void MethodB<T>() where T : struct { /* 泛型方法 B */ } public static void MethodC<T1, T2>() { /* 多泛型参数方法 C */ } } ``` 上述代码中的 `DummyCallForRetention` 函数虽然从未被执行过,但它会在预编译阶段向 IL2CPP 提供足够的信息以便正确处理相关类型的依赖关系[^1]。 2. **利用 Link.xml 文件配置排除列表** 如果某些类型无法通过代码层面完全覆盖,则可以通过编辑项目的 `LinkerConfig.LinkXml` 文件手动指定哪些类、方法或字段不应被裁剪掉。例如: ```xml <linker> <assembly fullname="Assembly-CSharp"> <type fullname="Namespace.HotUpdateManager" preserve="all"/> <type fullname="Namespace.OtherClassWithStaticMethods" preserve="methods"/> </assembly> </linker> ``` 此外还可以针对具体成员进行细粒度控制,比如仅保护某个单独的方法而不是整个类型[^1]。 3. **借助反射技术动态加载目标组件** 考虑到部分场景下难以提前枚举全部潜在需求项,此时可通过 Reflection API 动态获取所需实例及其关联行为。尽管这种方式增加了复杂性和性能开销,但在灵活性方面具有显著势。 4. **整 Stripping Level 设置** 在 Player Settings 中降低 Script Call Optimization 和 Managed Code Stripping Levels 参数值也能有效减少误删现象的发生概率。不过需要注意的是这样做可能导致最终产物体积增大以及启动时间延长等问题[^1]。 综上所述,对于 Unity 热更新代码中存在的静态方法裁剪风险,开发者可以根据实际情况灵活选用以上提到的一种或多钟措施加以应对。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值