목차

반응형

문제

문제의 메인 씬

자꾸 특정 씬으로 넘어갈 때 지연이 발생했다.

하지만 해당 씬에서는 문제가 될만한 스크립트도 없고 별 이유가 없어서 프로파일러를 켜서 확인해봤다.

 

프로파일러 내용

프로파일러로 확인해봤더니 File.Read에서만 2000개의 인스턴스가 생성되어서 지연되는 것으로 확인되었다.

하지만 나는 스크립트 상에서 파일을 읽는 부분은 전혀 넣지 않았는데 전혀 짚이는 것이 없었다.

 

게임에서 세이브 로드하는 부분을 전부다 주석 처리해봐도 효과는 없었고, 프로파일러 자세하게 돌려봐도 딱히 나오는 거 없었다.

결국 모든 오브젝트, 스크립트를 하나씩 삭제를 하면서 원인을 찾았다.

 

원인

원인은 특정 오브젝트에서 ScriptableObject(이하 SO)를 매우 많이 불러서 발생하는 문제였다.

이 SO를 엄청나게 많이 부르는 것도 문제지만 씬을 로드할 때마다 해당 오브젝트도 새로 생성되어서 약 1초 이상의 지연이 발생하는 것이었다.

헷갈릴만한 것이 유니티에서 인스펙터로 끌어다가 넣어주는 SO는 저렇게 잡혀서 잘 몰랐던 것이다.

 

이런 식으로 SO가 SO를 불러오고 그 SO가 또 다른 SO를 불러오고... 엄청난 지연이 발생할 만하다. 멍충아

렉이 저것밖에 안 걸리는 게 더 신기하다.

 

해결

SO를 대량으로 부르는 게임 오브젝트를 인스턴스, 싱글턴화, DontDestroyOnLoad 하여 게임을 시작할 때만 불러오고 이후로는 계속해서 오브젝트를 유지하는 방식으로 대체하였더니 해결되었다.

그리고 해당 문제를 겪어보니 게임에서 불러와야 하는 대량의 데이터가 있는 경우 게임을 로딩하거나 시작할 때 일괄적으로 불러오고 메모리에 항상 저 데이터를 들고 있다가 필요할 때 바로바로 꺼내와서 사용해야 한다고 생각이 들었다.

요즘 최적화와 오브젝트 풀링에 대해서 공부하고 있는데 좋은 경험이 되었다.

반응형