개발 라이브러리 & 툴/유니티

Unity 씬 이동 간에 빈 이동 씬을 이용하여 최대 사용 메모리 줄이기

하늘흐늘 2021. 11. 23. 20:31
반응형

이건 전 AXE팀의 NDC 발표 내용 중 일부인데 유니티에서 씬간의 이동시 중간에 빈 씬을 삽입하여 순간적 최대 사용 메모리 양을 줄이는 기법입니다. 이론적으로 말하자면 A씬에서 B씬으로 이동한다고 하였을 때 B씬이 로딩되었을 때 A씬이 언로드되기 전까지 최대 메모리 사용량은 A씬의 메모리 사용량 + B씬의 메모리 사용량이 됩니다. 이때 중간에 메모리 사용량이 거의 없는 빈 이동 씬을 삽입하여 A씬에서 빈 이동 씬으로 이동한 후에 빈 이동 씬에서 B씬으로 이동하게 만듭니다. 이런 빈 이동 씬을 이용하면 순간적 최대 사용 메모리양은 A씬 + 빈 이동 씬과 빈 이동 씬 + B씬 중 최대 메모리 사용량이 됩니다. NDC 내용을 보면 순간 최대 사용 메모리양으로 인하여 튕긴 현상이 있어서 이것을 구현하였다고 합니다.

해당 기법의 구현은 간단합니다. 제 구현은 아래와 같습니다.
우선 화면 처리에서 빈 이동 씬을 중간에 경유하는 것을 숨기기 위하여 씬간의 이동시 화면을 검게 만들었습니다. A씬에서 페이드 아웃하고 B씬 로딩시 페이드 인을 이용하였습니다. 이 부분은 페이드 아웃과 인의 처리가 각각의 프로그램마다 틀릴 수 있을 수 있습니다.
다음으로 빈씬을 이동하는 씬의 스크립트에서 아래와 같이 빈 씬,여기서의 빈씬 이름은 SceneMover,을 로딩합니다.
SceneManager.LoadScene("SceneMover");

빈 씬에는 게임 오브젝트 하나만을 만들고 아래와 같은 스크립트를 작성하였습니다.

public class SceneMover : MonoBehaviour
{
    void Start()
    {
        LoadScene();
    }

    void LoadScene()
    {
        SceneManager.LoadScene(Global.LevelSceneName);
    }
}

빈 씬이 로딩되고 기존 씬이 언로드되면 해당 게임오브젝트의 스크립트가 실행되어 다음 씬으로 이동할 것입니다.

여기서 생각해 볼 것인 다음 씬의 이름을 어떻게 넘기는 것인가 하는 것인데 싱글톤을 이용하는 방법이 있을 것입니다. 하지만 저는 Global.LevelSceneName이라는 정적 클래스의 변수를 이동하여 이동하게 만들었습니다.

이 기법은 유니티에서 최대 메모리 사용량 때문에 프로그램 튕김 현상이 있을 때 사용할만 합니다. 그 외에 단점은 씬 간의 이동시 빈 이동씬을 로딩하기 때문에 씬간의 이동시 이동 시간이 약간 증가할 수 있다는 것입니다.

반응형