핵심 요약
- 콘솔 및 블리자드 스타크래프트 2 개발에 참여했던 프로그래머가 프레임 저하를 막기 위해 사용한 스택 할당자 구현 경험을 공유했습니다.
- 애니메이션 블렌딩 과정의 대량 동적 할당을 정수 덧셈과 리셋만으로 단순화해 성능 병목을 완전히 제거했습니다.
- 이후 맵 스트리밍과 캐릭터 외형 변신 등 서로 다른 데이터가 메모리를 파편화하는 문제를 해결하는 양방향 스택 할당자 원리를 소개했습니다.
요약 비디오 게임과 같이 제한된 하드웨어 자원에서 극한의 성능을 끌어내야 하는 고성능 애플리케이션 개발에서는 메모리 할당 최적화가 필수적인 과제로 꼽힙니다.
필자는 2010년경 미드웨이 시애틀 산하 써리얼 소프트웨어(Surreal Software)에서 오픈월드 게임 ‘디스 이즈 베가스(This is Vegas)’ 개발에 참여해 애니메이션 프로그래밍을 담당했습니다. 당시 캐릭터 애니메이션은 본(bone) 상태 머신을 기반으로 여러 애니메이션 트리를 블렌딩하는 방식이었는데, 매 프레임 CPU에서 대량의 동적 메모리 할당이 발생해 프로파일러에서 심각한 병목 지점으로 나타났습니다.
이 문제를 해결하기 위해 도입한 방식이 바로 '스택 할당자(범프 할당자)'였습니다. 최대 필요 메모리(예: 1MB)를 미리 확보해 두고 최상단 위치(tos)만 정수 덧셈으로 이동시키는 방식으로, 할당은 정수 덧셈 한 번, 프레임이 끝난 후 해제는 tos를 0으로 리셋하는 정수 대입 한 번으로 끝났습니다. 복잡한 소멸자 처리나 단편화 관리 없이 획기적인 속도 향상을 얻어 프로파일러 상에서 할당 비용이 사실상 0에 수렴하게 되었습니다.
이후 블리자드의 스타크래프트 2 팀으로 이직한 필자는 상사인 제임스 안할트(James Anhalt)로부터 양방향 스택 할당자(Double Headed Stack Allocator)라는 해결책을 듣게 됩니다. 오픈월드 스트리밍 게임에서 맵 지형 데이터와 플레이어 외형 변신 데이터가 서로 다른 주기로 할당 및 해제될 때 발생하는 '메모리 단편화' 문제를 해결하는 기술로, 총 여유 공간이 충분함에도 연속된 메모리 블록이 부족해 할당이 실패하는 고질적 문제를 양방향 스택 구조로 깔끔하게 정리하는 원리입니다.
Sponsored · 광고