유니티 BrustCompile

BrustCompile란?

"BurstCompile"은 코드의 특정 부분을 고도로 최적화된 기계 코드로 컴파일하여 성능을 크게 향상시키는 기술입니다.

 

BurstCompile을 사용하는 경우의 실질적인 예는 물리 시뮬레이션과 같이 많은 양의 데이터를 처리해야 하는 게임입니다.

모래시계 안의 모래처럼 수천 개의 입자의 움직임을 시뮬레이션하는 게임을 만들고 있다고 가정해 보겠습니다. 각각의 입자들은 중력과 다른 입자들과 충돌하는 것과 같은 힘에 반응하면서 물리학의 법칙을 따라야 합니다.

BurstCompile을 사용하지 않으면 각 프레임에 작용하는 힘을 기준으로 새 위치를 계산하여 모든 입자에 루프하는 Update 함수를 작성할 수 있습니다. 


사용 예시

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

public class ParticleSystem : MonoBehaviour
{
    [BurstCompile]
    struct UpdateParticlesJob : IJobParallelFor
    {
        public NativeArray<Vector3> positions;
        public NativeArray<Vector3> velocities;
        public float deltaTime;

        public void Execute(int i)
        {
            // Apply gravity to the particle's velocity
            velocities[i] += new Vector3(0, -9.81f, 0) * deltaTime;

            // Move the particle based on its velocity
            positions[i] += velocities[i] * deltaTime;
        }
    }

    // ... rest of the ParticleSystem class ...
}

왜 빠를까?

Compilation to Machine Code : 버스트 컴파일러는 고급 C# 코드를 기계 코드로 변환합니다. 기계 코드는 컴퓨터 하드웨어에서 직접 이해할 수 있는 가장 낮은 수준의 코드로, 매우 빠르게 실행됩니다.

Static Compilation : Burst는 런타임에 코드를 해석하는 대신 코드를 미리 컴파일합니다(AOT 또는 Ahead-of-Time 컴파일). 즉, 게임을 하는 동안 해석으로 인한 오버헤드가 없으므로 코드 실행 속도가 빨라집니다.

Optimization : 버스트는 최적화 도구 모음을 포함하는 강력한 컴파일러 인프라인 LLVM 위에 구축됩니다. 이러한 도구를 사용하면 불필요한 작업을 제거하고, 더 나은 성능을 위해 지침을 재정렬하는 등의 방법으로 코드를 더 빠르게 실행할 수 있습니다.

SIMD Support : 버스트 컴파일러는 SIMD(Single Instruction, Multiple Data) 작업을 기본적으로 지원합니다. SIMD는 프로세서가 여러 데이터 포인트에서 동일한 작업을 동시에 수행할 수 있게 해 게임 개발에서 일반적으로 사용되는 처리 배열 또는 벡터 연산 처리와 같은 작업 속도를 크게 향상시킬 수 있습니다.

Job System Compatibility : Burst는 Unity의 Job System과 함께 작동하도록 설계되었으며, 이를 통해 컴퓨터가 한 번에 여러 작업을 수행할 수 있는 쉬운 멀티스레딩 기능을 제공합니다. 작업 시스템은 여러 프로세서 코어에서 동시에 코드를 실행하여 게임 객체 업데이트 또는 물리 처리와 같이 여러 번 수행해야 하는 작업 속도를 크게 높일 수 있습니다.

Safety Checks : 버스트는 작업에서 메모리에 올바르게 액세스하여 일반적인 프로그래밍 오류를 방지하는 안전 검사를 제공합니다. 코드가 안전한지 확인한 후에는 최종 게임에서 이러한 검사를 사용하지 않도록 설정하여 성능을 추가로 향상시킬 수 있습니다.