如果项目很大,代码量很多,不仅会使包体变大,编译时间变长,还会导致各种编译报错。比如:

ARM64 branch out of range (154869072 max is +/-128MB)

Unity提供了一种被称作托管代码剥离( managed code stripping )的方案用来删除未使用或无法访问的代码。托管代码剥离从托管程序集中删除代码,包括从项目中的 C# 脚本构建的程序集、作为包和插件一部分的程序集,以及 .NET Framework 中的程序集。

Unity 使用称为 Unity 链接器(Unity linker)的工具对项目程序集中的代码执行静态分析。静态分析识别在执行期间无法访问的任何类、类的部分、函数或函数的部分。此分析仅包括构建时存在的代码,因为在 Unity 执行静态分析时不存在运行时生成的代码。可以使用 托管剥离级别来控制剥离的程度。

配置托管代码剥离:

转到编辑 > 项目设置 > 播放器。
在其他设置中,找到优化一栏。

将 Managed Stripping Level 属性设置为所需的值。
属性 功能
Disabled 不会移除任何代码。如果使用 mono ,这是默认设置
Minimal 只在 UnityEngine 和 .net 类库中搜索未使用的代码。不会删除任何用户编写的代码。此设置最不可能导致任何意外的运行时行为如果使用 IL2CPP ,这是默认设置。

Managed Stripping Level 等级设置

Low Unity会搜索一些用户编写的程序集,以及所有 UnityEngine和 .net 类库来寻找未使用的代码。此设置应用一组规则,这些规则删除一些未使用的代码,但将意外后果的可能性降到最低,例如使用反射的运行时代码的行为更改。
Medium Unity 部分搜索所有程序集以查找无法访问的代码。此设置应用一组规则,这些规则剥离更多类型的代码模式以减少构建大小。尽管 Unity 不会删除所有可能无法访问的代码,但此设置确实会增加发生不良或意外行为更改的风险。
High Unity会对所有程序集进行广泛搜索,以找到无法访问的代码。在这个设置中,Unity优先考虑的是减少大小,而不是代码稳定性,并删除尽可能多的代码。这种搜索可能比较低的剥离级别花费更长的时间。彻底测试你的应用,仔细使用[Preserve]属性和link.xml文件,以确保Unity链接器不会剥离关键代码。
使用 托管代码剥离 需谨慎,防止必要的代码被剥离。我们可以使用 Preserve 或 Link.xml 来保护代码。

Preserve:
可以使用 Preserve 来防止 Unity 链接器剥离代码的特定部分。如果您的应用程序生成 Unity 执行静态分析时不存在的运行时代码,这将很有帮助;例如,通过反射。Preserve 要么为 Unity 链接器提供关于它不应该剥离哪些代码模式的一般指导,要么提供不剥离特定的、已定义的代码部分的指令。

例如:

class Foo
{[Preserve]public void PreservedMethod(){}
}

Link.xml :
也可以在项目中包括一个名为 link.xml 的 .xml 文件,以保留特定程序集或程序集的一部分的列表。xml 文件必须存在于 Assets 文件夹或项目中的 Assets 文件夹的子目录中,并且文件中必须包含 标记。Unity 链接器将保存在 link.xml 文件中的任何程序集、类型或成员视为根类型。

例如:

<!--No "preserve" attribute and no members specified means preserve all members-->
<type fullname="AssemblyName.MethodName"/><!--Preserve all fields on a type-->
<type fullname="AssemblyName.MethodName" preserve="fields"/><!--Preserve all fields on a type-->
<type fullname="AssemblyName.MethodName" preserve="methods"/><!--Preserve the type only-->
<type fullname="AssemblyName.MethodName" preserve="nothing"/><!--Preserving only specific members of a type-->
<type fullname="AssemblyName.MethodName"><!--Fields--><field signature="System.Int32 FieldName" /><!--Preserve a field by name rather than signature--><field name="FieldName" /><!--Methods--><method signature="System.Void MethodName()" /><!--Preserve a method with parameters--><method signature="System.Void MethodName(System.Int32,System.String)" /><!--Preserve a method by name rather than signature--><method name="MethodName" /><!--Properties--><!--Preserve a property, it's backing field (if present), getter, and setter methods--><property signature="System.Int32 PropertyName" /><property signature="System.Int32 PropertyName" accessors="all" /><!--Preserve a property, it's backing field (if present), and getter method--><property signature="System.Int32 PropertyName" accessors="get" /><!--Preserve a property, it's backing field (if present), and setter method--><property signature="System.Int32 PropertyName" accessors="set" /><!--Preserve a property by name rather than signature--><property name="PropertyName" /><!--Events--><!--Preserve an event, it's backing field (if present), add, and remove methods--><event signature="System.EventHandler EventName" /><!--Preserve an event by name rather than signature--><event name="EventName" /></type>

详细请参考 Unity 官方文档:

https://docs.unity.cn/cn/current/Manual/ManagedCodeStripping.html
如果你做了托管代码剥离,但是在IOS还是会报ARM64 branch out of range,那么 你可以打开Xcode工程进行如下设置:

优化等级设为 -Os
把主工程和UnityFramework工程的优化等级都设为 -Os

转自:https://www.jianshu.com/p/23ee1a176a90

Unity 托管代码剥离相关推荐

  1. Unity-托管代码剥离(link.xml使用)

    Unity-托管代码剥离 Unity托管代码剥离的意义 Unity托管代码的设置 link.xml简单使用 Unity托管代码剥离的意义 托管代码剥离,不仅可以减少生成的dll的大小,继而减少安装包的 ...

  2. Unity 托管内存(Managed Memory)

    翻译:https://unity3d.com/cn/learn/tutorials/topics/best-practices/managed-memory 理解托管堆对 Unity 中的内存管理至关 ...

  3. Unity 中的 .NET、Mono 和 IL2CPP

    接 上一篇 继续了解,重点是 IL2CPP. 一.Unity 的脚本后端 Unity 使用开源 .NET 平台,以确保使用 Unity 创建的应用程序可以跨平台运行. 脚本后端(scripting b ...

  4. unity导入的模型设置详谈(后面动作)

    此次咱们以2018版本为例,其他版本也差不多,有需要可以下方评论,我告诉大家对应的设置在哪,怎么设置. 咱们先讲Model这一栏 Scene:场景级属性,例如是否导入灯光和照相机,以及使用什么比例因子 ...

  5. Unity模型导入相关知识

    文章目录 常见的模型格式 模型导入参数设置 Model页签 Scene设置 Meshes设置 Geometry设置 Rig页签 Animation Type:动画类型 Avatar化身信息设置 Ani ...

  6. 2022-06-30 Unity核心8——模型导入

    文章目录 一.模型导入概述 二.Model 模型页签 三.Rig 模型页签 四.Animation 动画页签 五.Materials 材质纹理页签 一.模型导入概述 ​ Unity 支持很多模型格式. ...

  7. 【Unity动画系统笔记】

    目录 前言 旧版动画系统 处理旧版动画 Animation组件 Rig 选项卡 通用动画类型 人形动画类型 Animation 选项卡 Model 选项卡 前言 Unity可以用两种方式控制动画 1 ...

  8. UWA本地资源检测更新,助你严守项目性能的每个角落

    在上一期的文章中,我们为大家简单讲解了本地资源检测2.1版本更新中与项目资源相关的7条规则.今天,我们继续介绍此次更新中,C#代码扫描检测(新增6条). Editor设置检测(新增3条)以及场景检测( ...

  9. Unity-TA 成长之路(三)URP-Universal Render Pipeline

    因为Unity版本为2020.3.20,推荐使用Universal RP 10.6.0,所以去看了这个版本的文档. 而unity.cn也未对此部分做中文解释: 所以只能去看外文网站了,蹩脚的英文水平, ...

最新文章

  1. Roberts 边缘检测
  2. 自动驾驶定位技术-粒子滤波实践
  3. 不使用加减乘除法,完成两个数的加法
  4. 清北刷题冲刺 11-02 a.m
  5. php语言三个数从小到大排序,求教输入5个数,从小到大排序 的C语言程序?
  6. dynamic-insert=true dynamic-update=true,插入默认值的情况
  7. OSG与opengl的shader结合
  8. 为什么你应该尝试@reach/router
  9. Angular CLI的简单使用(1)
  10. LeetCode篇之链表:83(去重问题)
  11. 如何双启动Linux和Windows
  12. 基于JAVA+SpringBoot+Mybatis+MYSQL的在线心理测评管理系统
  13. DWR学习笔记 - Hello World
  14. HTML5 Notification
  15. 图神经网络:Graph Neural Networks
  16. clr20r3 程序终止的几种解决方案_IT外包桌面解决方案——不慌,蓝屏而已
  17. 周报(1.13到1.20)
  18. SQL Server 2008 R2
  19. 360张图围绕成为3d_3D设计将在10分钟内成为专业人士
  20. 什么是架构师?Java架构师一般多少年薪呢?

热门文章

  1. 《新文学》风吹过,雨无痕
  2. Lucene搜索原理
  3. JS实现点击导航栏鼠标左右滑动 (适用于PC端和移动端)
  4. 【Linux】lftp客户端使用详解
  5. 互联网金融大事件,从泛亚到e租宝敲响的警示钟?
  6. CVE-2018-8120漏洞复现(提权)
  7. js 判断一个日期是不是在下周一到下周日
  8. C++ operator=
  9. vlc推流的方法总结
  10. 一文入门USB设备的驱动编写方法