[25.04.04] TIL( 오브젝트 풀링 누수 문제 해결 )

설민우·2025년 4월 4일

내일배움캠프 - Unity

목록 보기
15/85

< 오브젝트 풀링 누수 >

오브젝트 풀링을 이용해서 GC 문제를 잡았다고 생각했는데 유니티의 프로파일러를 통해서 확인해보니 중간에 GC에 의해 프레임이 치솟문 문제를 확인했습니다.

위의 상황처럼 성능 테스트 중 녹빛의 GC 컬렉터에 의한 점유율이 70퍼센트를 먹을 정도로 높아지게 되었습니다.

오브젝트 풀링을 사용하고, 현재는 탄환 발사 이외에는 다른 동작을 하고 있지 않아 원인 분석이 쉬웠고, 이에 대한 이유는

아래의 사진에서 확인할 수 있었습니다.

이 사진에서 보듯이 사용이 끝난 오브젝트인데도 풀로 돌아가지 않는 문제가 있었고, 이를 처리해줘야 했습니다.

여러가지로 문제 상황을 고민해보고 다양한 시도를 해봤습니다만, 가장 효과적이고 직관적이었던 해결책은 아래와 같았습니다.

- 1. Sprite와 PoolObject의 분리

기존에는 Sprite 자체를 부모 객체에서 관리하고 있었으나 이를 분리했습니다.

이미 PoolManager에서 SetActive() 를 관리하고 있었는데도, 추가적으로

이렇게 공격을 발사하는 과정에서 Init 이전에 SetActive를 false로 해주는 과정이 있었고
이 도중 Init을 시켜주기 전에 발사를 주도하는 객체가 파괴되면 문제가 발생했던 것이었습니다.

때문에, PoolObject가 있어 상시 확인해주어야 하는 부모를 상위로 빼고, Sprite는 자식 오브젝트로 두어 키고 끌 수 있도록 했습니다.

- 2. Updpate 문을 이용하여 poolObject 체크

하지만 그럼에도 아직까지 객체가 남아있는 경우가 있었습니다.

이는 도착 직후고 발사한 객체가 사라졌을때, 목표 오브젝트가 진행중에 사라졌을때 발생했던 문제로

이미 화살 Sprite의 오브젝트가 꺼져있다면 || Tween 애니메이션이 완료되었다면 || 적에게 맞은것이 체크 되었다면

이 3가지를 기준으로 특정 시간마다 자기 자신을 반환해야하는지 체크하는 부분을 추가해 주었습니다

< 결론 >

  • 위와 같은 과정을 통해서 누수되는 오브젝트들을 0으로 만들어 GC가 발동되는 것을 최소화 했고, 수많은 오브젝트가 발사되고 있음에도 프레임이 100~200으로 방어되는 것을 확인했습니다. 특히, 수백개 이상의 오브젝트가 DoTween을 통해 날아갈 때, 이전의 경우 GC 에 의해 거의 게임이 멈추었지만 적어도 30프레임 정도는 방어 하는 모습을 확인할 수 있었습니다.
  • 오브젝트 풀링을 배울때 GC를 잡을 수 있다 라는 것만 배웠지 이렇게 누수되는 오브젝트들이 특정한 케이스에 발생 할 수 있다는 것은 생각하지 못했습니다. 이번 문제를 꽤나 긴 시간에 걸쳐 해결하면서 오브젝트 풀링은 강력한 기능이나 관리가 중요하다는 것을 깨달을 수 있었습니다.

성능 테스트 영상

링크텍스트

profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글