Search Unity

1년 전 안정된 버전의 버스트 컴파일러를 처음 출시한 이후 품질, 환경, 성능이 지속적으로 개선되어 왔습니다. Burst 1.3의 출시와 더불어 이번 포스팅에서는 이 버전에 도입된 새로운 기능과 향후 계획에 대해 알려드리고자 합니다.

유니티는 항상 사용자와 파트너의 의견에 귀를 기울이고 있습니다. 또한 유니티 내부적으로 Burst 사용 빈도가 점점 증가하고 있습니다. 유니티는 이 과정에서 얻은 다양한 피드백을 기초로 지난 분기에 다음 4가지 영역에서 개선 작업을 수행했습니다.

  • 확장성
  • 성능
  • 품질
  • 사용성 및 디버깅 가능성

Burst가 DOTS(데이터 지향 기술 스택)의 핵심 요소인 점을 고려하여, 새로 출시된 버스트 컴파일러 1.3 버전에서는 더 나은 사용자 경험을 제공하고자 각 영역을 개선하는 데 중점을 두었습니다.

데스크톱용 크로스 컴파일

많은 사용자가 에디터를 실행 중인 플랫폼이 아닌 다른 플랫폼용 데스크톱 플레이어를 컴파일할 수 있는 옵션을 요청했습니다. 대표적인 예로 Unity Build Cloud 서비스를 사용하고 macOS에서 빌드 머신을 실행하면서 Windows용 플레이어를 생성하려고 하는 경우를 들 수 있습니다. 이번에 출시된 Burst를 이용하면 다양한 데스크톱 플랫폼에서 Mono 기반 플레이어를 컴파일할 수 있습니다.

단, 이 기능은 데스크톱 빌드 플레이어에서만 지원됩니다. 콘솔과 모바일 플랫폼의 경우, SDK가 단 하나의 호스트 플랫폼과 호환되어 컴파일 작업이 이루어질 수 있는 플랫폼이 제한되는 경우가 많기 때문입니다.

네이티브 디버깅

Burst로 컴파일한 코드에 대한 디버깅 또한 오래 기다려온 기능입니다. 얼마 전까지만 해도 버스트 코드를 디버깅하는 유일한 방법은 Burst를 비활성화하고 기존의 .NET 관리형 디버깅 기능에 의존하는 것이었습니다.

이제 Burst 1.3 버전에서는 Visual Studio, XCode, VSCode 등 원하는 IDE에 포함된 네이티브 디버거를 사용하여 버스트 코드를 디버그할 수 있습니다.

이 기능을 활성화하려면 Unity 에디터의 Burst 메뉴에서 Enable Native Debugging을 선택하면 됩니다. 디버깅 환경에서 수행할 수 있는 작업은 아래와 같습니다.

  • 조건부 중단점을 비롯한 중단점 적중(데이터 중단점도 가능)
  • 프레임 콜스택 검사
  • 로컬 변수 검사
  • 구조체 및 데이터 검사, 포인터 추적
  • 디버거 감시 사용

이 기능을 사용하려면 일반 .NET IDE에서 별도의 네이티브 디버거를 실행해야 합니다. 그런 다음 해당 네이티브 디버거를 게임이나 Unity 에디터에 연결하면 됩니다. 자세한 내용은 아래의 동영상 튜토리얼을 참고하시기 바랍니다.

사용자는 일반 .NET 관리형 코드와 더불어 보다 통합된 디버깅 경험을 기대합니다. 유니티에서도 이러한 요구 사항을 인식하고 있지만 현재로서는 디버깅 경험이 저하되는 문제가 있습니다. 향후 이 부분을 해결할 수 있도록 지속적으로 노력할 것입니다.

Debug.Log 문자열 지원

사용성 개선을 위한 또 한 가지 기능은 Debug.Log와 일부 문자열에 대한 지원으로, Unity 2019.3 이상 버전부터 제공합니다.

이 기능에 대한 자세한 내용은 기술 자료에서 확인할 수 있습니다.

새로운 인텔 CPU 내장 함수 API

Burst는 SIMD 기능을 활용하도록 최적화되었습니다. Burst가 지원하는 Unity Mathematics 패키지는 API를 제공하여 표준 벡터 유형(예: float3, float4)을 지정하고, 2D 및 3D 워크로드 작업 시 발생하는 다양한 계산을 더 효율적으로 수행할 수 있도록 지원합니다.

또한 기존 하드웨어를 최대한 활용하고 사용자를 지원하기 위해서는 추상적인 수학 API를 제공하는 것 외에 더 많은 고급 최적화 시나리오를 구축해야 합니다. 그래서 이번 버전에는 새로운 인텔 CPU 내장 함수 API가 도입되었습니다.

컴파일 타임

게임 최적화를 위해 Burst를 사용하는 스튜디오와 팀이 점점 늘어나면서 Burst로 컴파일하고 최적화해야 하는 사용자 코드의 양이 증가하고 있습니다. 이전 버전에 에디터 환경과 스탠드얼론 플레이어 빌드에 사용할 수 있는 멀티스레드 컴파일 기능이 도입되었지만, 에디터를 재시작할 때 컴파일러가 전체 프로젝트를 다시 컴파일해야 하는 문제가 여전히 있었습니다.

유니티는 확장성 문제를 해결하기 위해 Burst 1.3 버전에 컴파일 결과를 디스크에 캐싱하는 기능을 도입하여 에디터를 재시작할 때 Burst가 이전에 컴파일된 코드를 더 이상 다시 컴파일할 필요가 없도록 했습니다.

하지만 앞으로도 컴파일 시간을 더 단축해야 합니다. 다음 분기에 이 기능을 더욱 개선하여 Burst로 보다 큰 규모의 프로젝트에 대한 반복 작업을 더 빠르게 수행할 수 있도록 지원할 예정입니다.

 

코드 생성 개선

동시 쓰기 액세스를 허용하지 않는 C# 잡 시스템 덕분에 버스트 컴파일러는 일반 C++ 컴파일러보다 코드를 더 효과적으로 최적화할 수 있습니다. Burst의 중요한 최적화 기능 중 하나는 자동 벡터화 기능으로, 일반 스칼라 코드보다 서너 배 더 높은 성능을 제공합니다. 정교한 게임 데이터의 레이아웃에 이 기능을 사용하면 데이터 지향적이지 않은 게임 코드에 비해 코드의 효율성을 10배 이상 높일 수 있습니다.

이번에 출시된 Burst에서는 코드를 자동 벡터화하기 위해 메모리 앨리어싱 분석 기능을 새롭게 개편했습니다. 또한 코드에 어설션을 제공하는 새로운 내장 함수를 도입하여 두 개의 메모리 레퍼런스 간에 앨리어싱 현상이 일어나지 않았는지, 또는 루프가 벡터화되어야 하는지(아직 실험 단계) 확인할 수 있도록 해줍니다.

이 기능에 대한 자세한 내용은 메모리 앨리어싱 및 noalias 기술 자료에서 확인할 수 있습니다.

  

추가 버그 수정

버스트 컴파일러는 신뢰할 수 있는 코드를 생성하지만 여느 컴파일러와 마찬가지로 버그가 발생할 수는 있습니다. 유니티는 1.2 버전 출시 이후 많은 문제와 유효하지 않은 코드 생성 사례를 해결했습니다. 또한 버스트 컴파일러의 완성도를 높이기 위해, 새로운 버전을 출시할 때마다 프로젝트의 규모를 확대하여 더 많은 단위 테스트와 통합 테스트를 제공하고 있습니다.

이번에 출시된 버전은 코드 생성 성능과 안정성이 모두 향상되었습니다.

 

향후 계획

유니티는 항상 사용자의 피드백을 수렴하여 우선 순위를 조정하고 있으며, 향후 계획은 다음과 같습니다.

  • 에디터 사용 및 플레이어 빌드 시 컴파일 시간 단축
  • 코드 생성 개선
  • ARM CPU를 위한 새로운 내장 함수 API 도입
  • C# 지원 개선(foreach, IDisposable 등)

 

지금 Burst 사용해 보세요

Burst는 DOTS와 함께 현재 사용 가능하며, 안정성과 성능이 지속적으로 개선되고 있습니다.

주요 데스크톱, 콘솔, 모바일 플랫폼을 지원하며, 최신 버전인 Unity 2020.2 알파를 비롯하여 Unity 2018.4 이상 버전에서 안정성이 검증되었습니다.

다음 포스팅에서는 Burst를 더 효과적으로 활용하는 방법과 향후 계획에 대해 알려드리겠습니다.

Burst를 어떻게 활용하고 있는지 후기를 공유해 주세요. 문의 사항이나 문제가 있는 경우 언제든지 DOTS 포럼에 알려주시기 바랍니다.

14 replies on “프로젝트 최적화를 위한 버스트 컴파일러 1.3”

Thanks to sharing the nice blog about the information of Optimize projects with Burst. It’s really help for us….

What is Burst good for?

Serious question!!!

What kinds of games, game features and devices benefit from the efforts required to find a Unity version and Burst version that’s production ready, and learning how to use Burst?

Burst is mostly used with the job system, and every game/application can benefits from it. I know of at least 3 games that shipped with it and it would not have been possible to even create 2 of those games without Burst. In my own project I gained ~20x speed increase. Burst is definitely one of Unitys gems

Probably the best feature Unity has introduced for years – and essential for the company’s future.

+1 for deterministic floats.

First of all thanks for the great work!
Secondly we used it in a shipped game for real-time texture modification on mobile and it worked perfectly and are using burst in our pre-production of our current game in DOTS which is systemic and with lots of unit and the magic that it is doing is undescribable.

What I personally look forward to now is more speed ups in compilation time and cross-architecture deterministic floats so a multiplayer game hosted on x86 can be deterministic with ARM clients. This said the x86 determinism on its own is good enough for so many cases.

The new debugging experience also and the simple addition of Debug.Log is great. Disabling burst for debugging was ok but this is fantastic and also helps in the rare case that the bug only happens when using burst

I’m glad to see that you’ve added a CPU intrinsics API, but it’s very disappointing that it can’t be used outside of burst jobs.

I have a C# physics engine that pretty much requires the use of SIMD to be performant. Using it inside Unity right now is not feasible, and porting it to burst jobs would mean rewriting the entire thing.

I’m glad you’ve added the CPU intrinsics API to burst, but it’s very disappointing that this can’t be used outside of the job system.

I have my own physics engine written in C# that really needs to use SIMD for reasonable performance. It’s basically unusable inside Unity as it currently stands. Porting it to burst jobs isn’t feasible.

Comments are closed.