2022. 4. 12. 23:25ㆍTech/Unity
- 목차
이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.
서론
Unity는 작업할 때 Scene단위로 합니다. Scene을 어떻게 구성하냐는 만드는 사람의 재량이나 설계에 따라 천차만별이지만 한 프로젝트에서는 꽤나 많은 Scene을 사용합니다. 이 말인즉슨, Scene끼리의 전환은 필수로 일어난다 생각할 수 있습니다. 그러면 이렇게 Scene끼리의 전환 시 별다른 문제가 없을까요? 오늘은 실제 작업을 할 때 발생했던 Scene 사이의 전환 문제에 대해 원인부터 해결법까지 다뤄보려 합니다.
Scene전환
예전에는 Application.LodeLevel()으로 요즘에는 SceneManager.LodeScene() / SceneManager.LodeSceneAysnc() 등의 함수로 씬 전환을 할 것입니다. 그런데 사양이 떨어지는 모바일 환경 같은 경우에 씬 전환할 때 튕겼던 적을 경험한 적이 있지 않습니까? 제가 겪었던 문제가 바로 이것이었습니다.
이유는 간단합니다다. 씬 전환할 때 메모리가 급격히 증가하기 때문입니다. 메모리 펌핑 현상이 발생했기 때문이죠.
음… 아니 다음씬으로 전환되면, 이전 씬의 오브젝트들은 파괴되어 메모리가 반환될 텐데 왜죠? 그럼 부족하지 않아야 하잖아요? 맞는 말입니다. 다음 씬이 로드되면 이전 씬의 오브젝트들은 파괴됩니다. 물론, Dontdestroyonload()등의 처리가 된 녀석들은 제외하고 말입니다.
위의 말을 좀더 자세하게 살펴보겠습니다. '다음 씬이로드된 후 파괴되어 메모리가 반환된다' 아… 다음 씬이 로드된 상태는 이미 상당량의 메모리를 사용하고 있는데 이전 씬의 메모리도 남아있는 것입니다.
즉, A씬 -> B씬일 때 A씬 메모리 + B씬 메모리의 구간이 생기는 것입니다.
그럼 어떻게 해결을 했을까요? 저의 경우에는 중계 씬을 만들어 해결했었습니다. 중계씬이라고 하면 잘 모르는 사람은 로딩씬이라고 생각하면 될것 같습니다. 오브젝트가 거의 없어 메모리를 많이 차지않는 씬을 전환되는 씬들 사이에 두는 것이죠. A씬 -> 중계씬 -> B씬 의 경우는 중계 씬에서 A씬의 메모리가 해제되고 B씬이 로드되면 중계 씬의 적은 메모리가 해제되기 때문에 메모리 튕김 현상이 줄어들 것입니다. 이 방식은 의외로 많은 프로젝트에서 사용한다고 합니다. 물론, 어디까지나 중계 씬과 다음 씬의 메모리를 감당하는 환경이어야 합니다.
물론 이외의 방법도 있을 것입니다. 어디까지나 이 방식은 주관적으로 좋은 거 같습니다. 여담으로 많은 모바일 게임들이 로딩 신을 만드는 이유는 위의 이유도 한몫한다는 이야기도 있습니다.
'Tech > Unity' 카테고리의 다른 글
[Unity]직렬화(Serialization) (0) | 2022.04.13 |
---|---|
[Unity]로드된 리소스의 메모리 누수 (0) | 2022.04.13 |
[Unity]Unity mobile native plugin (0) | 2022.04.12 |
[Unity]코루틴(Coroutine) (0) | 2022.04.12 |
[Unity]Unity Monobehaviour 생명주기(life cycle) (0) | 2022.04.12 |