『Wizsurvive』 프로젝트가 점점 완성도를 높여가면서, 이제 단순한 시스템 구축을 넘어
게임 퍼포먼스를 최적화하는 단계에 접어들었다.
이번 Dev Log에서는 실제 개발 과정 중 발생했던 성능 문제들과, 이를 해결하기 위해 어떤 최적화 작업을 진행했는지를 기록하려 한다.
최적화의 필요성 인식
개발 초기에는 기능 구현에 집중하다 보니, 퍼포먼스 문제를 크게 의식하지 않았다.
하지만 플레이 시간이 길어지고 몬스터 수가 많아지면서 점점 문제가 드러나기 시작했다.
대표적인 증상은 다음과 같았다.
- 프레임 드랍(FPS 하락)
- 오브젝트 생성 지연
- 배경 리소스 로딩 시 순간 멈춤
- 긴 플레이 후 렉 발생
특히 모바일 환경을 염두에 두고 있었기 때문에, 최적화는 선택이 아니라 필수였다.
퍼포먼스 최적화 작업
1. 오브젝트 풀링 시스템 강화
처음에는 몬스터나 발사체를 생성/삭제하는 방식을 사용했는데,
이 방식은 Garbage Collection(메모리 수거) 부하가 심각하게 쌓였다.
그래서 모든 몬스터, 스킬 발사체, 아이템 드랍 오브젝트를 오브젝트 풀링 방식으로 변경했다.
- 필요할 때 꺼내 쓰고
- 사용 후에는 비활성화시켜 풀로 되돌리는 구조
이 덕분에 생성/삭제에 소모되는 연산량을 크게 줄일 수 있었고, 프레임 유지율이 크게 향상되었다.
2. 이펙트 및 파티클 최적화
특히 몬스터 사망 이펙트나 스킬 이펙트가 쌓이면서 퍼포먼스가 급격히 떨어졌다.
이를 해결하기 위해:
- 이펙트의 지속 시간을 짧게 조정
- 화면에 동시에 보여지는 파티클 개수 제한
- 필요 없는 경우 이펙트를 강제 소멸 처리
또한 파티클 시스템을 경량화하여,
- 기본 파티클 텍스처 해상도 감소
- 단순 연산량을 가진 머티리얼 사용
이런 식으로 무겁지 않은 파티클 연출로 바꿔, 비주얼은 유지하면서 부하를 줄였다.
3. 백그라운드 리소스 로딩
맵 전환이나 새로운 웨이브가 시작될 때 로딩 지연이 발생하는 문제가 있었다.
이 문제는 필요한 리소스를 미리 불러오는 프리로딩(Preloading) 시스템을 구축해서 해결했다.
- 게임 시작 시, 다음 2~3개의 맵 리소스를 백그라운드에서 로딩
- 스폰 예정 몬스터의 스켈레톤, 이펙트도 미리 로딩
- 플레이 도중에는 실제 교체 시점에 단순히 활성화만 처리
덕분에 5분 루프를 도는 동안 별다른 끊김 없이 부드럽게 맵과 몬스터가 전환되도록 만들 수 있었다.
4. 불필요한 Tick 제거
언리얼 엔진에서는 Actor가 Tick(매 프레임마다 실행되는 업데이트)을 사용하는 경우가 많다.
하지만 필요 없는 Tick은 게임 퍼포먼스를 심각하게 깎아먹는다.
그래서:
- 이동, 공격 등 필요한 순간에만 Tick을 활성화
- 기본적으로는 모든 Actor의 Tick을 비활성화
- Event 기반으로 움직임이나 동작을 제어
하는 방식을 적용했다.
이 최적화만으로도 전체 CPU 부하가 눈에 띄게 감소했다.
최적화 작업 중 겪은 문제와 해결
최적화를 하면서 예상치 못한 문제들도 생겼다.
- 풀링된 오브젝트가 상태를 초기화하지 않고 재사용되어, 이상 동작하는 경우
- 이펙트를 너무 과하게 줄여 비주얼 임팩트가 떨어진 문제
- 프리로딩 로직 중 일부가 메인 스레드(Block)로 끼어들어 오히려 지연이 발생한 경우
이 문제들은
- 오브젝트 풀 리턴 시 초기화 함수 추가
- 고정 이펙트 유지와 가벼운 이펙트 분리 적용
- 프리로딩은 무조건 별도 스레드에서 처리
같은 방법으로 수정하고 안정화시켰다.
최적화 결과
최적화 이후 다음과 같은 개선 결과를 얻을 수 있었다.
- 초기 FPS 35~40 → 최적화 후 FPS 58~60 (모바일 기준)
- 플레이 시간 20분 이상 경과 후에도 끊김 없이 진행 가능
- 로딩 시간 약 30% 감소
- 메모리 점유율 20% 감소
덕분에 『Wizsurvive』는 장시간 플레이해도 쾌적하게 진행할 수 있는 게임이 되었다.
특히 모바일 환경에서도 안정적인 퍼포먼스를 유지할 수 있게 되어,
'언제 어디서나 가볍게 즐길 수 있는' 게임 목표에 한 걸음 더 다가설 수 있었다.