메모리 관리에 대한 팁과 모범 사례

다음 섹션은 게임의 오디오 메모리를 효과적으로 관리하는 방법에 대한 팁과 모범 사례를 보여줍니다.

메모리 한계점 사용하기

이 문서의 이전 섹션에서 간단히 다루었듯이, 사운드 엔진의 한 개 이상의 메모리 풀에 메모리 한계점(threshold)을 정의할 수 있습니다. 오디오 프로그래머가 사운드 엔진의 초기화 매개 변수에서 다음의 값을 변경하면 메모리 풀의 한계점을 정의할 수 있습니다.

  • AkInitSettings::fDefaultPoolRatioThreshold

  • AkPlatformInitSettings::fLEngineDefaultPoolRatioThreshold

기본적으로 메모리 한계점은 기본 값인 1 (또는 100%)을 사용하여 비활성화되어 있습니다. 이 값을 0에서 1 사이의 값으로 설정하여 한계점을 활성화할 수 있습니다.

메모리 한계점이 비활성화되면 메모리 할당은 정상적으로 실행됩니다. 메모리 한계점이 활성화되면 엔진이 주기적으로 메모리의 백분율이 지정된 한계점보다 낮은지를 확인합니다. 한계점을 초과할 경우 시스템이 우선 순위가 가장 낮은 사운드부터 제거를 시작합니다.

한계점이 사용되지 않는 상황에서 엔진은 사운드의 우선 순위를 따르지만, 메모리가 부족할 경우 우선 순위가 높은 사운드마저 재생할 메모리가 부족해서 재생되지 않을 수 있습니다. 메모리 한계점이 사용되면 우선 순위가 낮은 사운드가 제거되어 우선 순위가 높은 사운드가 유지되도록 공간을 확보합니다.

사운드 엔진에서 메모리 단편화 다루기

메모리에 추가되고 제거되는 데이터 덩어리를 다룰 때엔 언제나 일정량의 메모리 단편화(fragmentation)가 일어나기 마련입니다. Wwise는 자체적으로 메모리 단편화를 해결하지는 않지만 메모리 풀은 단편화의 발생량을 줄이도록 설계되었습니다.

기본 메모리 풀은 주로 사운드 구조 메타 데이터에 사용되며 대부분 작은 오브젝트로 구성되어 있기 때문에 단편화가 문제되지 않습니다. 엔진 내부(lower engine) 메모리 풀은 오디오 파이프라인과 처리를 위해 확보되며 큰 블록을 포함하지만 이 블록은 오디오가 재생을 멈출 때 비워집니다. 이 두 개의 메모리 풀 모두 약 10%의 오버헤드를 할당하면 대부분의 단편화를 방지할 수 있습니다.

뱅크에 저장되는 오디오 데이터의 경우, 각 LoadBank() 호출 때마다 사용자가 정의한 풀에 별도로 복사되어 오디오 프로그래머가 오디오 데이터의 메모리 단편화를 효율적으로 조절할 수 있습니다. 오디오 프로래머가 각 풀의 가장 큰 뱅크를 블록 크기로 두고 AkFixedSizeBlocksMode 플래그를 CreatePool로 전달하여 블록 크기가 고정된 풀을 사용하면 메모리 단편화를 최대한 방지해볼 수 있습니다. 이렇게 하면 모든 뱅크가 가장 크기가 큰 뱅크인 것처럼 할당됩니다. 물론 한 개 이상의 풀을 확보해 각 풀이 특정 크기의 뱅크에 대해 일정한 개수의 슬롯/블록을 제공하도록 할 수도 있습니다. AkFixedSizeBlocksMode 풀의 메모리 블록은 GetBlock()을 통해 얻어지며 항상 같은 크기입니다. 이 방법을 사용하면 단편화를 완전히 방지할 수 있습니다.