Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Управляемое удаление кода удаляет неиспользуемый код из сборки, что может значительно уменьшить окончательный размер сборки. При использовании IL2CPPразработанной Unity серверной части сценариев, которую можно использовать в качестве альтернативы Mono при создании проектов для некоторых платформ. . Подробнее
См. Словарь
. сократить время сборки, потому что меньше кода нужно преобразовать в C++ и скомпилировать. Управляемое удаление кода удаляет код из управляемых сборок, включая сборки, созданные из скриптов C#фрагмент кода, позволяющий создавать собственные Компоненты, запускайте игровые события, изменяйте свойства Компонентов с течением времени и реагируйте на ввод данных пользователем любым удобным для вас способом. Подробнее
Просмотрите в Словарь
в своем Проекте сборки, входящие в состав пакетов и плагинов, и сборки в рамках .NET.

Управляемое удаление кода работает путем статического анализа кода в проекте для обнаружения классов, членов классов и даже частей функций, которые никогда не могут быть доступны во время выполнения. Вы можете контролировать, насколько агрессивно Unity удаляет недостижимый код, с помощью параметра Управляемый уровень очистки в Настройках проигрывателяНастройки которые позволяют вам устанавливать различные параметры для конкретного игрока для финальной игры, созданной Unity. Подробнее
См. в окне Словарь
(в разделе Оптимизация ).

Важно! Когда ваш код (или код в подключаемом модуле) динамически ищет классы или члены с использованием отражения, инструмент удаления кода не всегда может обнаружить, что проект использует эти классы или члены, и может удалить их. Чтобы объявить, что проект использует такой код, используйте атрибуты link.xml или Preserve.

Managed stripping levels

Контролируйте, насколько агрессивно Unity удаляет неиспользуемый код, с помощью параметра Управляемый уровень очистки в проекте Настройки проигрывателя.

Настройка управляемого уровня зачистки
Настройка управляемого уровня зачистки

Примечание. Значение по умолчанию для этого параметра зависит от текущей Scripting Backendфреймворка. который поддерживает сценарии в Unity. Unity поддерживает три различных бэкэнда для сценариев в зависимости от целевой платформы: Mono, .NET и IL2CPP. Однако универсальная платформа Windows поддерживает только два: .NET и IL2CPP. Дополнительная информация
См. в настройках Словарь
.

Свойства Функции
Disabled Нет code is removed.

Этот параметр является уровнем разделения по умолчанию для серверной части сценариев Mono. Параметр «Отключено» недоступен, если выбрана серверная часть сценариев IL2CPP, поскольку она влияет на время сборки. Больше управляемого кода означает создание большего количества кода C++ для IL2CPP, а значит, большего количества кода C++ для компиляции. В результате между внесением изменения в код и просмотром этого изменения в действии проходит гораздо больше времени.

Low Удаляет код в соответствии с консервативным набором правил, который должен удалить большую часть недостижимого кода, сводя к минимуму возможность удаления кода, который фактически используется. Низкий уровень зачистки способствует удобству использования, а не уменьшению размера.

Этот параметр является уровнем разделения по умолчанию для IL2CPP (и использовался во многих выпусках редактора Unity).

Medium Удаляет код в соответствии с набором правил, обеспечивающих баланс между низким и высоким уровнями очистки. Средний уровень зачистки менее осторожен, чем Низкий уровень зачистки, но не настолько экстремальн, как Высокий уровень зачистки. Таким образом, риск нежелательных побочных эффектов от удаления кода выше, чем при низком уровне очистки, но меньше, чем при высоком уровне очистки.

Используйте средний уровень очистки с серверной частью сценариев IL2CPP, чтобы еще больше сократить время итерации между внесением изменений в код и его тестированием.

Средний уровень разделения недоступен при использовании параметра .NET 3.5 Scripting Runtime Version.

High Удаляет как можно больше недостижимого кода и создает сборки меньшего размера, чем средний уровень зачистки. Высокий уровень зачистки отдает предпочтение уменьшению размера, а не удобству использования; вам может понадобиться добавить файлы link.xml, сохранить атрибуты или переписать проблемные участки кода.

Высокий уровень очистки требует больше времени для анализа, чтобы добиться дополнительного уменьшения размера, поэтому время сборки и итераций может быть больше, чем при среднем уровне очистки.

Высокий уровень разделения недоступен при использовании параметра .NET 3.5 Scripting Runtime Version.

Примечание. Параметры управляемого уровня очистки не влияют на процесс удаления неиспользуемого кода Unity Engine (который доступен при использовании бэкэнда сценариев IL2CPP). б> настройка).

В этом разделе описываются подробности удаления управляемого кода, а также способы выявления и устранения любых связанных с этим проблем, которые могут возникнуть.

Когда вы создаете проект в Unity, в процессе сборки ваш код C# компилируется в формат байт-кода .NET, который называется Common Intermediate Language (CIL). Этот байт-код CIL упакован в файлы, называемые сборками. Аналогичным образом библиотеки .NET Framework и любые библиотеки C# в подключаемых модулях, которые вы используете в проекте, также предварительно упакованы в виде сборок байт-кода CIL. Обычно процесс сборки включает в себя весь файл сборки, независимо от того, сколько кода в сборке использует ваш проект.

Управляемый процесс удаления кода анализирует сборки в вашем проекте, чтобы найти и удалить код, который на самом деле не используется. Анализ использует набор правил, чтобы определить, какой код оставить, а какой выбросить. Эти правила сочетают размер сборки (включая слишком много кода) с риском (удаление слишком большого количества кода). Параметр Управляемый уровень удаления позволяет контролировать, насколько агрессивно следует удалять код.

UnityLinker

В процессе сборки Unity используется инструмент под названием UnityLinker для удаления управляемого кода. UnityLinker — это версия Mono IL Linker, настроенная для работы с Unity. UnityLinker построен на основе нашего разветвления проекта, который тесно связан с исходным проектом IL Linker. . (Обратите внимание, что пользовательские части UnityLinker, специфичные для Unity Engine, не поддерживаются в ответвлении.)

Как работает UnityLinker

UnityLinker анализирует все сборки в вашем проекте. Во-первых, он помечает корневые типы, методы, свойства, поля и т. д. верхнего уровня, например классы, производные от MonoBehaviour, которые вы добавляете в GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь
в СценаСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь
являются корневыми типами. Затем UnityLinker анализирует отмеченные им корни для идентификации и отмечает любой управляемый код, от которого зависят эти корни. После завершения этого статического анализа любой оставшийся непомеченный код становится недостижимым для любого пути выполнения кода вашего приложения и удаляется из сборки.

Обратите внимание, что этот процесс не запутывает код.

Отражение и удаление кода

UnityLinker не всегда может обнаружить случаи, когда код в вашем проекте ссылается на другой код через reflection и может по ошибке удалить код, который на самом деле используется. По мере повышения уровня управляемого удаления с низкого до высокого риск того, что удаление кода вызовет непреднамеренное изменение поведения в игре, также возрастает. Такие изменения в поведении могут варьироваться от тонких логических изменений до сбоя, вызванного вызовом отсутствующего метода.

UnityLinker может обнаруживать и обрабатывать некоторые шаблоны отражения. Примеры последних шаблонов, с которыми он может работать, см. в разделе Mono IL Linker набор тестов на отражение. Однако, когда вы выходите за рамки тривиального использования рефлексии, вы должны дать UnityLinker несколько подсказок о том, какие классы не следует трогать. Вы можете предоставить эти подсказки в виде файлов link.xml и атрибутов Preserve:

  • Атрибут сохранения: отметьте элементы для сохранения непосредственно в исходном коде.
  • Файл link.xml — укажите, как должны сохраняться элементы в сборках.

UnityLinker рассматривает каждый элемент, сохраненный с атрибутом или файлом link.xml, как корневой, когда анализирует сборку на наличие неиспользуемого кода.

Сохранить атрибут

Используйте атрибут [Сохранить] в исходном коде, чтобы UnityLinker не удалял этот код. В следующем списке описано, какие сущности сохраняет UnityLinker, когда Preserve применяется к различным элементам кода:

  • Сборка: сохраняет все типы в сборке (как если бы для каждого типа был назначен атрибут [Сохранить]). Чтобы назначить сборке атрибут Preserve, поместите объявление атрибута в любой файл C#, включенный в сборку, вне любых объявлений пространств имен:

    using System; using UnityEngine.Scripting; [assembly: Preserve] namespace Example { public class Foo {} }
  • Тип: сохраняет тип и его конструктор по умолчанию.
  • Метод: сохраняет метод, его тип объявления, тип возвращаемого значения и типы всех его аргументов.
  • Свойство: сохраняет свойство, его тип объявления, тип значения, метод получения и метод установки.
  • Поле: сохраняет поле, его тип объявления и тип поля.
  • Событие: сохраняет событие, его тип объявления, тип возвращаемого значения, метод добавления и метод удаления.
  • Делегат: сохраняет тип делегата и все его методы.

Обратите внимание, что пометка объекта кода в файле link.xml дает вам немного больше контроля, чем при использовании атрибута Preserve. Например, украшение класса атрибутом Preserve сохраняет как тип, так и конструктор по умолчанию. В файле link.xml вы можете сохранить только тип (без конструктора по умолчанию).

Вы можете определить атрибут Preserve в любой сборке и в любом пространстве имен. Итак, вы можете использовать класс UnityEngine.Scripting.PreserveAttribute, создать его подкласс или создать свой собственный класс PreserveAttribute, например:

class Foo { [UnityEngine.Scripting.Preserve] public void UsingUnityPreserve(){} [CustomPreserve] public void UsingCustomPreserve(){} [Preserve] public void UsingOwnPreserve(){} } class CustomPreserveAttribute : UnityEngine.Scripting.PreserveAttribute {} class PreserveAttribute : System.Attribute {}

Атрибут AlwaysLinkAssembly

Используйте атрибут [assembly: UnityEngine.Scripting.AlwaysLinkAssembly], чтобы заставить UnityLinker обрабатывать сборку независимо от того, ссылается ли на нее другая сборка, включенная в сборку. Атрибут AlwaysLinkAssembly может быть определен только в сборке.

Этот атрибут только указывает UnityLinker на применение его Правил маркировки корня к сборке. Сам по себе атрибут не обеспечивает непосредственного сохранения кода в сборке. Если ни один элемент кода не соответствует правилам маркировки корня для сборки, UnityLinker все равно удаляет сборку из сборки.

Используйте этот атрибут для пакетов или предварительно скомпилированных сборок, которые содержат один или несколько методов с атрибутом [RuntimeInitializeOnLoadMethod], но которые не могут содержать типы, прямо или косвенно используемые в каких-либо сценах проекта.

Если сборка определяет [assembly: AlwaysLinkAssembly] и на нее также ссылается другая сборка, включенная в сборку, атрибут не влияет на выходные данные.

XML ссылки

Файл link.xml представляет собой список для каждого проекта, в котором указано, как сохранять сборки, а также типы и другие объекты кода в них. Чтобы использовать файл link.xml, создайте его (см. пример ниже) и поместите в папку «Активы проекта» (или любой подкаталог «Активы»). Вы можете использовать любое количество файлов link.xml в проекте, поэтому плагины могут предоставлять свои собственные декларации о сохранении. UnityLinker рассматривает любую сборку, тип или элемент, сохраненный в файле link.xml, как корневой тип.

Обратите внимание, что файлы link.xml не поддерживаются внутри пакетов, но вы можете ссылаться на сборки пакетов из файлов link.xml, не входящих в пакет.

В следующем примере показаны различные способы объявления корневых типов сборок проекта с помощью файла link.xml:

<linker> <!-- Preserve types and members in an assembly --> <assembly fullname="Assembly1"> <!--Preserve an entire type--> <type fullname="Assembly1.A" preserve="all"/> <!--No "preserve" attribute and no members specified means preserve all members--> <type fullname="Assembly1.B"/> <!--Preserve all fields on a type--> <type fullname="Assembly1.C" preserve="fields"/> <!--Preserve all fields on a type--> <type fullname="Assembly1.D" preserve="methods"/> <!--Preserve the type only--> <type fullname="Assembly1.E" preserve="nothing"/> <!--Preserving only specific members of a type--> <type fullname="Assembly1.F"> <!-- Fields --> <field signature="System.Int32 field1" /> <!--Preserve a field by name rather than signature--> <field name="field2" /> <!-- Methods --> <method signature="System.Void Method1()" /> <!--Preserve a method with parameters--> <method signature="System.Void Method2(System.Int32,System.String)" /> <!--Preserve a method by name rather than signature--> <method name="Method3" /> <!-- Properties --> <!--Preserve a property, its backing field (if present), getter, and setter methods--> <property signature="System.Int32 Property1" /> <property signature="System.Int32 Property2" accessors="all" /> <!--Preserve a property, its backing field (if present), and getter method--> <property signature="System.Int32 Property3" accessors="get" /> <!--Preserve a property, its backing field (if present), and setter method--> <property signature="System.Int32 Property4" accessors="set" /> <!--Preserve a property by name rather than signature--> <property name="Property5" /> <!-- Events --> <!--Preserve an event, its backing field (if present), add, and remove methods--> <event signature="System.EventHandler Event1" /> <!--Preserve an event by name rather than signature--> <event name="Event2" /> </type> <!--Examples with generics--> <type fullname="Assembly1.G`1"> <!--Preserve a field with generics in the signature--> <field signature="System.Collections.Generic.List`1 field1" /> <field signature="System.Collections.Generic.List`1 field2" /> <!--Preserve a method with generics in the signature--> <method signature="System.Void Method1(System.Collections.Generic.List`1)" /> <!--Preserve an event with generics in the signature--> <event signature="System.EventHandler`1 Event1" /> </type> <!--Preserve a nested type--> <!--Preserve all fields of a type if the type is used. If the type is not used it will be removed--> <type fullname="Assembly1.I" preserve="fields" required="0"/> <!--Preserve all methods of a type if the type is used. If the type is not used it will be removed--> <type fullname="Assembly1.J" preserve="methods" required="0"/> <!--Preserve all types in a namespace--> <type fullname="Assembly1.SomeNamespace*" /> <!--Preserve all types with a common prefix in their name--> <type fullname="Prefix*" /> </assembly> <!--Preserve an entire assembly--> <assembly fullname="Assembly2" preserve="all"/> <!--No "preserve" attribute and no types specified means preserve all--> <assembly fullname="Assembly3"/> <!--Fully qualified assembly name--> <assembly fullname="Assembly4, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> <type fullname="Assembly4.Foo" preserve="all"/> </assembly> <!--Force an assembly to be processed for roots but don’t explicitly preserve anything in particular. Useful when the assembly is not referenced.--> <assembly fullname="Assembly5" preserve="nothing"/> </linker>

Специальные XML-атрибуты сборки

Элемент файла link.xml имеет три специальных атрибута:

  • игнорировать при отсутствии Если вам нужно объявить сохранения для сборки, которая не существует во время всех сборок проигрывателя, используйте атрибут ignoreIfMissing для элемента в файле link.xml:

    <linker> <assembly fullname="Foo" ignoreIfMissing="1"> <type name="Type1"/> </assembly> </linker>
  • ignoreIfUnreferenced

    В некоторых случаях может потребоваться сохранить объекты в сборке, только если на эту сборку ссылается другая сборка. Используйте атрибут ignoreIfUnreferenced для элемента в файле link.xml, чтобы сохранять объекты в сборке, только если в сборке есть ссылка хотя бы на один тип.

    <linker> <assembly fullname="Bar" ignoreIfUnreferenced="1"> <type name="Type2"/> </assembly> </linker>

    Примечание. Не имеет значения, был ли сам код в ссылочной сборке удален или нет, указанные элементы ссылочной сборки с этим атрибутом все равно сохраняются.

  • среда выполнения Windows

    При определении способов сохранения для сборки метаданных среды выполнения Windows (.winmd) необходимо добавить атрибут windowsruntime="true" к элементу в файле link.xml:

    <linker> <assembly fullname="Windows" windowsruntime="true"> <type name="Type3"/> </assembly> </linker>

Как UnityLinker разделяет сборки

Редактор Unity сопоставляет список сборок, содержащих типы, используемые в любой из сцен вашего проекта Unity, и передает его в UnityLinker. Затем UnityLinker обрабатывает эти сборки, любые ссылки на эти сборки, любые сборки, объявленные в файле link.xml, и любые сборки с атрибутом AlwaysLinkAssembly. Как правило, любая сборка, включенная в проект и не подпадающая ни под одну из этих категорий, не будет обрабатываться UnityLinker и не будет включена в сборку проигрывателя.

Для каждой сборки, которую обрабатывает UnityLinker, он следует набору правил, основанных на классификации сборки, наличии в сборке типов, используемых в сцене, и управляемом уровне разделения, который вы выбрали для сборка.

Для целей настоящих правил сборки делятся на следующие категории:

  • Сборки библиотеки классов .NET — включает библиотеки классов Mono, такие как mscorlib.dll и System.dll, а также внешние сборки библиотек классов .NET, такие как netstandard.dll.

  • Сборки Platform SDK – включает управляемые сборки, относящиеся к платформе SDK. Например, сборка windows.winmd, являющаяся частью универсальной платформы Windowsфункции IAP, которая поддерживает симулятор Microsoft In App Purchase, который позволяет протестировать потоки покупок IAP на устройствах перед публикацией приложения. Дополнительная информация
    См. в Словарь
    SDK.

  • Сборки модулей Unity Engine — включают управляемые сборки, составляющие Unity Engine, например UnityEngine.Core.dll.

  • Сборки проекта — включают сборки, характерные для проекта, например:

В следующих разделах подробно описано, как UnityLinker помечает и сохраняет или удаляет ассемблерный код для каждого параметра Managed Stripping Level:

Низкий уровень очистки

При выборе Низкого Управляемого уровня очистки UnityLinker удаляет код в соответствии с консервативным набором правил, которые должны удалить большую часть недостижимого кода, сводя к минимуму возможность код зачистки, который фактически используется. Низкий уровень зачистки способствует удобству использования, а не уменьшению размера.

Правила низкой корневой маркировки

Правила корневой маркировки определяют, как UnityLinker идентифицирует типы верхнего уровня в сборке.

Тип сборки Действие Правила маркировки корня
.NET Class & Platform SDK Strip Применять меры предосторожности
Сохранения, определенные в любом link.xml
Assemblies containing types used in a scene Copy Помечает все типы и элементы в сборке
All other Strip Отмечает все общедоступные типы
Отмечает все открытые члены открытых типов
Отмечает методы с атрибутом [RuntimeInitializeOnLoadMethod].
Маркирует типы и элементы, имеющие атрибут [Сохранить]
Сохранения, определенные в любом link.xml
Помечает все типы, производные от MonoBehaviour и ScriptableObject в:

Предварительно скомпилированные сборки

Сборки пакетов

Сборки определения сборки

Сборки сценариев Unity

Test Strip Отмечает методы с любым атрибутом, определенным в NUnit.Framework. Например: [Тест]
Помечает методы атрибутом [UnityTest].

Примечание. Действие Strip означает, что UnityLinker анализирует сборку на наличие кода, который можно удалить. Действие Копировать означает, что UnityLinker копирует всю сборку в окончательную сборку (а также помечает все типы в ней как корневые типы).

Правила маркировки низкой зависимости

После того как корневые типы отмечены, UnityLinker выполняет статический анализ, чтобы идентифицировать любой код, от которого зависят эти корневые типы.

Цель правила Описание
Unity Types Когда UnityLinker помечает тип, производный от MonoBehaviour, он также помечает все члены этого типа..
Когда UnityLinker помечает тип, производный от ScriptableObject, он также помечает все члены этого типа.
Attributes UnityLinker помечает любые атрибуты на всех отмеченных сборках, типах, методах, полях, свойствах и т. д..
Debugging Attributes Когда вы включаете отладку скриптов, UnityLinker помечает все элементы, имеющие атрибут [DebuggerDisplay], даже если нет пути кода, использующего этот член.
.NET Facade Class Library Assembly Фасадные сборки — это сборки в библиотеках классов .NET, которые пересылают определения типов в другую сборку. Например, netstandard.dll, часть уровня совместимости API .NET Standard 2.0, представляет собой фасадную сборку, которая определяет интерфейс .NET, но передает реализацию этого интерфейса другие сборки .NET.

Фасадные сборки не являются обязательными во время выполнения, однако, поскольку вы можете написать код отражения, который зависит от них, низкий уровень разделения сохраняет эти сборки.

Пример атрибута DebugDisplay

В следующем примере предполагается, что вы не используете свойство Foo.UnusedProperty в своем коде. Обычно UnityLinker удаляет свойство, но когда вы включаете отладку скрипта, он помечает Foo.UnusedProperty и сохраняет его из-за атрибута [DebuggerDisplay] в Фу.

[DebuggerDisplay("{UnusedProperty}")] class Foo { public int UnusedProperty { get; set; } }

Средний уровень зачистки

При выборе Среднего Управляемого уровня очистки UnityLinker удаляет код в соответствии с набором правил, обеспечивающих баланс между Низким и < b>Высокий уровень очистки. Средний уровень очистки менее осторожен, чем Низкий уровень очистки, но не настолько экстремальн, как Высокий уровень очистки. Таким образом, риск нежелательных побочных эффектов от удаления кода больше, чем Низкий уровень удаления, но меньше, чем Высокий уровень удаления.

Правила маркировки среднего корня

Тип сборки Действие Правила маркировки корня
.NET Class & Platform SDK Strip То же, что и низкий уровень очистки, за исключением того, что: НЕ применяется предупредительная консервация.
Сборки с типами, на которые есть ссылки в сцене Strip НЕ помечает автоматически все типы и элементы в сборке
Отмечает методы с атрибутом [RuntimeInitializeOnLoadMethod].
Маркирует типы и элементы, имеющие атрибут [Сохранить]
Сохранения, определенные в любом link.xml
Помечает все типы, производные от MonoBehaviour и ScriptableObject в:

Предварительно скомпилированные сборки

Сборки пакетов

Сборки определения сборки

Сборки сценариев Unity

All other Strip То же, что и низкий уровень очистки, за исключением:

Общедоступные типы НЕ помечаются автоматически

Открытые члены общедоступных типов НЕ помечаются автоматически

Test Strip То же, что и низкий уровень зачистки

Правила маркировки средних зависимостей

Цель правила Описание
Unity Types То же, что и низкий уровень зачистки
Attributes То же, что и низкий уровень зачистки
Debugging Attributes То же, что и низкий уровень зачистки
.NET Facade Class Library Assembly То же, что и низкий уровень зачистки

Высокий уровень зачистки

При выборе Высокого Управляемого уровня очистки UnityLinker удаляет максимально возможную часть недостижимого кода и создает сборки меньшего размера, чем Средний уровень очистки. Высокий уровень очистки отдает предпочтение уменьшению размера, а не удобству использования; вам может понадобиться добавить файлы link.xml, сохранить атрибуты или даже переписать проблемные участки кода.

Правила высокой корневой маркировки

Тип сборки Action Правила маркировки корней
.NET Class & Platform SDK Strip То же, что и средний уровень зачистки
Сборки с типами, на которые есть ссылки в сцене Strip То же, что и средний уровень зачистки
All other Strip То же, что и средний уровень зачистки
Test Strip То же, что и низкий уровень зачистки

Связать исключения тегов функций XML

Файлы

Link.xml поддерживают редко используемый атрибут XML "features". Например, файл mscorlib.xml, встроенный в mscorlib.dll, использует этот атрибут, но при необходимости его можно использовать в любом файле link.xml.

Во время удаления на высоком уровне UnityLinker исключает сохранения для функций, которые не поддерживаются, исходя из настроек текущей сборки:

<ул>
  • удаленное взаимодействие — исключено при нацеливании на серверную часть сценариев IL2CPP.
  • sre — исключается при нацеливании на серверную часть сценариев IL2CPP.
  • com — исключается при таргетинге на платформы, не поддерживающие COM.
  • Например, в следующем файле link.xml сохраняется один метод типа на платформах, поддерживающих COM, и один метод на всех платформах:

    <linker> <assembly fullname="Foo"> <type fullname="Type1"> <!--Preserve FeatureOne on platforms that support COM--> <method signature="System.Void FeatureOne()" feature="com"/> <!--Preserve FeatureTwo on all platforms--> <method signature="System.Void FeatureTwo()"/> </type> </assembly> </linker>

    Правила маркировки высокой зависимости

    Цель правила Описание
    Unity Types То же, что и низкий уровень зачистки
    Attributes На всех отмеченных сборках, типах и членах UnityLinker помечает атрибуты, если тип атрибута также был отмечен.

    Обратите внимание, что UnityLinker всегда сохраняет определенные атрибуты, поскольку они требуются среде выполнения.

    UnityLinker удаляет связанные с безопасностью атрибуты, такие как System.Security.Permissions.SecurityPermissionAttribute, из всех сборок, типов и элементов.

    Debugging Attributes UnityLinker всегда удаляет атрибуты отладки, такие как DebuggerDisplayAttribute и DebuggerTypeProxyAttribute.
    .NET Facade Class Library Assembly В отличие от уровней разделения Low и Medium, которые сохраняют все сборки фасадов .NET, уровень разделения High удаляет все фасады, поскольку они не нужны во время выполнения.

    Код отражения, предполагающий существование сборок фасада после удаления, не будет работать.

    Редактирование тел методов

    Когда вы устанавливаете уровень разделения High, UnityLinker редактирует тела методов, чтобы еще больше уменьшить размер кода. В этом разделе приведены некоторые важные изменения, которые UnityLinker вносит в тела методов.

    В настоящее время UnityLinker редактирует тела методов только в сборках библиотеки классов .NET. Обратите внимание, что после редактирования тела метода исходный код сборки больше не соответствует скомпилированному коду в сборке, что может затруднить отладку.

    Удалить недоступные ветки

    UnityLinker удаляет блоки операторов If, которые проверяют System.Environment.OSVersion.Platform и недоступны для текущей целевой платформы.

    Встраивание — методы доступа только к полям

    UnityLinker заменяет вызовы методов, которые получают или устанавливают поле, прямым доступом к полю. Это часто позволяет полностью отказаться от метода, что помогает уменьшить размер.

    При нацеливании на серверную часть Mono UnityLinker вносит это изменение только в том случае, если вызывающему методу разрешен прямой доступ к полю на основе видимости поля. Для IL2CPP правила видимости не применяются, поэтому UnityLinker вносит это изменение там, где это уместно.

    Встраивание — константные методы возвращаемого значения

    UnityLinker встраивает вызовы методов, которые просто возвращают константное значение.

    Удаление пустого неответного звонка

    UnityLinker удаляет вызовы пустых методов с возвращаемым типом void.

    Удаление пустой области

    UnityLinker удаляет блоки Try/Finally, когда блок finally пуст. Удаление пустых вызовов может привести к созданию пустых блоков finally. Когда это происходит во время редактирования метода, UnityLinker удаляет весь блок Try/Finally. Это может произойти, когда компилятор создает блоки Try/Finally как часть цикла foreach для вызова Dispose().

    Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
    Руководство Unity 2021.3