← Назад к вопросам

Что такое Burst?

2.7 Senior🔥 131 комментариев
#Unity Core#Оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Burst?

Burst — это официальный компилятор от Unity Technologies, разработанный специально для высокопроизводительной компиляции C# Job System кода (кода, использующего IJob, IJobParallelFor и другие интерфейсы Job System) в оптимизированный машинный код, который выполняется непосредственно на процессоре, минуя промежуточные слои .NET виртуальной машины и JIT-компиляции.

По сути, Burst превращает безопасный, управляемый C# код, написанный в парадигме Data-Oriented Technology Stack (DOTS), в невероятно быстрый нативный код, сравнимый по производительности с кодом, написанным на C или C++. Это ключевой компонент экосистемы DOTS, наряду с Entity Component System (ECS) и C# Job System.

Как работает Burst?

  1. Компиляция "Ahead-of-Time" (AOT): В отличие от стандартного JIT-компилятора .NET, который компилирует код "на лету" во время выполнения, Burst работает как статический компилятор. Он анализирует и компилирует код Jobs на этапе сборки проекта (или в редакторе при входе в Play Mode), генерируя высокооптимизированный машинный код для целевой платформы (x64, ARM и т.д.).

  2. LLVM Backend: Burst использует LLVM (Low Level Virtual Machine) — промышленный стандарт для создания оптимизирующих компиляторов. LLVM позволяет применять глубокие и низкоуровневые оптимизации к сгенерированному коду, которые недоступны обычному JIT .NET.

  3. Ограниченное подмножество C#: Burst компилирует не весь C#, а строго определённое его подмножество, ориентированное на вычисления. Это позволяет компилятору делать радикальные предположения и оптимизации. Например:

    *   Нет поддержки виртуальных методов, делегатов (кроме `FunctionPointer`), боксинга.
    *   Ограниченная работа с managed-объектами (классами). Акцент на **неуправляемые типы** (`struct`, `NativeArray`, `Blittable` типы).
    *   Требуется явное указание атрибута `[BurstCompile]` на job-структуре и её методе `Execute()`.

Пример кода с использованием Burst

using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;

public class BurstExample : MonoBehaviour
{
    void Start()
    {
        // Создаём NativeArray для работы в неуправляемой памяти
        var numbers = new NativeArray<float>(1000, Allocator.TempJob);

        // Заполняем массив данными
        for (int i = 0; i < numbers.Length; i++) numbers[i] = i;

        // Создаём экземпляр job
        var squareJob = new SquareJob { Numbers = numbers };

        // Планируем выполнение job. Burst скомпилирует его в нативный код.
        JobHandle jobHandle = squareJob.Schedule(numbers.Length, 64);
        jobHandle.Complete(); // Ожидаем завершения

        // Проверяем результат (например, первый элемент)
        Debug.Log($"Результат: {numbers[0]}"); // Выведет: Результат: 0
        Debug.Log($"Результат: {numbers[5]}"); // Выведет: Результат: 25

        // Обязательно освобождаем память
        numbers.Dispose();
    }

    // Job-структура, помеченная атрибутом для компиляции через Burst
    [BurstCompile]
    public struct SquareJob : IJobParallelFor
    {
        public NativeArray<float> Numbers; // Данные, передаваемые по ссылке

        // Метод, который будет выполнен для каждого индекса. Скомпилирован Burst.
        public void Execute(int index)
        {
            // Эта простая операция будет невероятно оптимизирована
            Numbers[index] = Numbers[index] * Numbers[index];
        }
    }
}

Ключевые преимущества Burst

  • Экстремальная производительность: Ускорение вычислений в 5-50 раз (а иногда и более) по сравнению с обычным managed C# кодом. Это достигается за счёт:
    *   **Векторизации инструкций (SIMD)**: Автоматическое использование SSE, AVX, NEON инструкций для параллельной обработки данных.
    *   **Агрессивных оптимизаций циклов**: Развёртывание циклов, удаление границ проверок массивов (в безопасном контексте).
    *   **Оптимизации памяти**: Работа только со стеком и выделенной неуправляемой памятью, минимизация аллокаций.
  • Детерминированность: Скомпилированный код не содержит "сюрпризов" сборщика мусора (GC), что критически важно для стабильного геймплея и мультиплеера.
  • Сниженное энергопотребление: Более эффективный код быстрее завершает работу, позволяя CPU раньше вернуться в состояние низкого энергопотребления (важно для мобильных устройств).
  • Кроссплатформенность: Генерирует оптимизированный код под каждую целевую платформу (Windows, macOS, iOS, Android, консоли).

Ограничения и требования

  • Только для Job System: Burst работает только с кодом, реализующим интерфейсы Jobs (IJob, IJobParallelFor, IJobEntity и т.д.).
  • "Burst-совместимый" C#: Код должен использовать примитивные типы, struct, NativeArray, Blittable типы. Нельзя использовать: строки (string), managed-массивы, делегаты, foreach по коллекциям .NET, try/catch, рефлексию.
  • Атрибут [BurstCompile]: Без него компиляция не произойдёт.
  • Математика через Unity.Mathematics: Для максимальной производительности и переносимости рекомендуется использовать типы (float3, quaternion) и функции из пространства имён Unity.Mathematics, а не стандартные UnityEngine.Vector3/Quaternion.

Итог: Burst — это не просто "ускоритель", это парадигмальный сдвиг в разработке на Unity. Он позволяет писать высокопроизводительный, безопасный и переносимый C# код, который по скорости исполнения приближается к нативным языкам, оставаясь при этом в рамках управляемой и более безопасной среды C# и Job System. Это фундаментальный инструмент для разработки современных игр с высокой плотностью сущностей (например, стратегий, симуляторов, MMO) и требовательных к вычислениям приложений (научная визуализация, VR/AR).

Что такое Burst? | PrepBro