Enter Play Mode Settings
개요
Enter Play Mode Settings란 유니티 2019부터 실험적(Experimental)으로 들어간 기능이다. 2020버전 부터는 정식 지원인듯. Project Settings - Editor 에서 선택할 수 있다.
아무튼 이 기능이 뭐냐면 유니티 에디터에서 Play Mode로 진입하는 속도를 대폭 향상시켜주는 기술이다. 얼마나 속도가 빨라지는지는 아래를 보자.
원리
당연히 잃는 것 없이 실행 속도가 빨라졌다면 유니티에서 굳이 옵션으로 제공하지 않았을 것이다. 속도를 향상시키기 위해서 유니티에서는 도메인과 씬의 Reload과정을 생략한다.
도메인 리로드
도메인 리로드에서는 다음과 같은 일을 한다
- 스크립트 직렬화
- 유니티 도메인 언로드
- 새로운 유니티 도메인 생성
- 스크립트 역직렬화
도메인이란 대충 어셈블리를 모아놓은 논리적인 컨테이너이다.
위와 같은 과정을 통해서 도메인 리로드 과정에서는 스크립트를 초기화시킨다. 정적 필드와 정적 이벤트 핸들러도 초기화 시킨다. 프로젝트에 스크립트 갯수가 많으면 많을수록 이 과정은 오래 걸린다. (디스크와 I/O 포함)
따라서 도메인 리로드 과정을 생략하면 속도가 상승하게 되는 것이다.
그러나, 도메인이 초기화 되지 않기 때문에 정적 필드나 정적 이벤트 핸들러가 초기화되지 않는다는 문제가 있다. 이를 위해 정적 필드나 이벤트를 초기화하기 위한 어트리뷰트를 달아서 초기화를 진행한다.
//정적 필드의 초기화
public class StaticCounterExampleFixed : MonoBehaviour
{
static int counter = 0;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
counter = 0;
}
}
//정적 이벤트 핸들러의 초기화
public class StaticEventExampleFixed : MonoBehaviour
{
[RuntimeInitializeOnLoadMethod]
static void RunOnStart()
{
Application.quitting -= Quit;
}
}
씬 리로드
씬 리로드가 수행되면 Unity는 기존의 모든 게임 씬 오브젝트를 삭제하고 디스크에서 씬을 다시 로드한다. 이 과정은 씬이 복잡할수록 오래 걸린다.
만약 씬 리로드를 비활성화 하면 디스크에서 씬을 다시 로드하는 대신 씬 내의 수정된 컨텐츠만 초기화를 한다. 따라서 플레이 모드 진입 속도가 빨라진다.
그러나, 씬 자체의 재생성 과정이 없기 때문에 직렬화 되어있지 않은 Monobehaviour나 Scriptable 오브젝트들의 필드가 초기화되지 않는다. 당연히 엔진에서 오브젝트를 다시 생성하며 생성자를 호출하는 과정이 생략되었기 때문이다.
도메인과 씬 리로드에 대한 자세한 내용은
https://docs.unity3d.com/kr/2020.1/Manual/ConfigurableEnterPlayModeDetails.html
위 링크를 참고
참고 :
https://docs.unity3d.com/kr/2020.1/Manual/ConfigurableEnterPlayMode.html
https://blog.unity.com/kr/technology/enter-play-mode-faster-in-unity-2019-3