Wwise SDK 2024.1.6
|
원하는 한도에 맞추어 메모리 사용량을 줄이는 것은 꽤나 어려운 일일 것입니다. 다음은 메모리 사용을 줄이는 데 도움이 되는 방법들입니다.
오브젝트 메모리 사용은, 메모리 내에 불러오는 사운드와 이벤트 개수 및 게임 오브젝트의 양에 따라 직접적인 영향을 받습니다. 오브젝트 메모리는 사운드 디자인의 작동을 구현하기 위해 프로젝트 안에 들어있는 오브젝트들의 모든 속성을 포함합니다. 여기에는 또한 모든 게임 오브젝트와 연관된 정보(게임 싱크 값, 위치, 방향, 등)도 포함돼있습니다. 더 많은 뱅크를 불러올수록 더 많은 메모리가 할당돼야 합니다. 이때 필요한 메모리 크기는, 하나의 시나리오, 레벨, 맵, 게임 영역 등과 같은 환경에서 재생될 사운드의 개수에 대해서만 영향을 받습니다. 이러한 할당을 줄이는 데 도움이 되는 방법이 있습니다.
Processing 카테고리의 메모리는 사운드를 재생하는 데 사용됩니다. 여기에는 오디오 음원을 압축 해제하고 효과를 적용하며 믹싱하는 데 필요한 버퍼가 포함돼있습니다. 이 메모리는 동시에 재생하는 사운드의 개수에 영향을 받습니다. 또한 동시에 사용되는 효과의 개수와 유형에도 영향을 받습니다. 이를 줄이려면 자신의 게임에서 한 번에 몇 개의 사운드가 들리도록 할 것인지를 곰곰이 생각해보는 것이 좋습니다. 어떤 게임의 시나리오는 사운드 10 개조차 드물게 들리도록 할 수 있지만, 또 다른 게임에서는 수백 개가 넘어갈 수도 있습니다. 이 때 최악의 상황을 고려해야 합니다.
참고로 일부 게임(Xbox One)을 프로파일링해본 결과 다음과 같은 수치가 나왔습니다.
처리에 사용되는 메모리를 줄이려면 동시 보이스 개수를 줄여야 합니다. 이는 다음과 같은 방법으로 처리할 수 있습니다.
![]() | 참고: 버스에도 한도를 설정할 수 있습니다. |
![]() | 참고: 볼륨 한계점을 런타임에 프로그래밍으로 변경할 수 있습니다. 이 방법은 많은 처리를 요하는 게임 장소에서 사용하면 더 많은 보이스를 'under volume threshold (볼륨 한계점 이하)' 상태로 보낼 수 있습니다. |
SoundBank가 차지하는 메모리의 양은 대부분 포함된 사운드 데이터에 의해 결정됩니다. 자신의 미디어가 사용하는 메모리 양은 다음과 같은 방식으로 제어할 수 있습니다.
Wwise는 오디오 렌더링 틱 한 개 미만 동안 지속되는 일부 임시 할당을 관리하기 위해 내부 메모리 풀을 사용합니다. 이는 고급 프로파일러의 메모리 탭에서 "Temp Alloc"으로 표시됩니다. 이러한 임시 할당은 특정 시간 동안만 존재하고, 오버헤드가 거의 없으며, 사운드 엔진에서 내부적으로 처리되며, 개발자가 제공한 메모리 할당 후크로 전달할 수 없습니다. 대신, Advanced Profiler와 메모리 할당 후크에서 관찰되는 유일한 할당은 임시 할당이 이루어지는 더 큰 메모리 블록입니다. 따라서 게임에서 메모리 사용을 보다 최적화하기 위해 "Temp Alloc" 메모리 블록 관리를 수동으로 조정하는 것이 좋습니다.
AK::MemoryMgr::Init
동안 AkMemSettings::tempAllocSettings
는 각 Temp Alloc 카테고리에 대한 메모리 블록의 동작을 제어합니다. 특히 여기에는 메모리 블록의 크기, 시스템이 항상 할당해 두는 최소 블록 수, 시스템이 메모리를 해제하기 전에 틱 동안 사용되지 않아야 하는 블록 수를 구성하는 것이 포함됩니다. AK::TempAlloc::GetStats()
를 사용하면 런타임에 게임에서 Temp Alloc 시스템이 얼마나 많은 메모리를 사용하는지 확인하고 시스템 구성을 보다 세부적으로 조정할 수 있습니다.
다음은 게임 요구 사항이나 프로파일링 중에 관찰된 다른 동작에 따른 몇 가지 제안 사항입니다.
AK::TempAlloc::InitSettings::uMinimumBlockSize
를 기본값보다 낮은 값으로 설정하는 것이 좋습니다. 이렇게 하면 언제든지 게임에 필요한 메모리 사용량에 더 잘 맞출 수 있습니다.AK::TempAlloc::Stats::uPeakMemUsed
를 측정하여 Temp Alloc 시스템의 최대 메모리 사용량을 확인한 다음, AK::TempAlloc::InitSettings::uMinimumBlockCount
가 충분히 높은 값으로 설정되어 사운드 엔진이 초기화될 때 사용할 수 있는 모든 블록이 할당되고 그 이후로 해제되지 않도록 합니다.AK::TempAlloc::InitSettings::uMaximumUnusedBlocks
를 높은 값으로 설정하여 메모리 부하가 낮은 기간에도 시스템이 새로운 블록을 할당하되 해제하지는 않도록 할 수 있습니다.AK::TempAlloc::InitSettings::uMinimumBlockSize
를 낮추는 것이 좋습니다.일부 디버깅 옵션은 AK::TempAlloc::InitSettings
에서 사용할 수 있습니다. 사운드 엔진의 Debug 및 Profile 구성에서 AK::TempAlloc::InitSettings::bDebugDetailedStats
및 AK::TempAlloc::InitSettings::bDebugEnableSentinels
는 사용 통계의 추적을 개선하고 버퍼 초과를 쉽게 감지할 수 있도록 기본적으로 활성화되어 있습니다. 애플리케이션에 가장 높은 성능이나 가장 정확한 프로파일링 데이터가 필요한 경우 이러한 옵션을 비활성화합니다. 사운드 엔진의 Release 설정에서는 이러한 옵션에 대한 지원이 완전히 제거되었습니다.
Wwise에는 단일 함수나 코드 블록에만 존재하는 단기 메모리 할당을 처리하기 위한 "Bookmark Allocator"(Temp Alloc과 유사)라는 시스템이 있습니다. Bookmark Allocator를 통해 Wwise는 스택에 있는 것처럼 임시 메모리 할당을 수행할 수 있습니다. 그러나 스레드의 스택에 할당된 메모리가 모든 다양한 상황을 처리할 수 있을 만큼 충분히 클 것이라는 것에 의존하는 대신, Bookmark Allocator는 일반적인 메모리 할당을 사용하여 필요한 리소스를 제공합니다.
AkMemSettings::bookmarkAllocSettings
는 "Bookmark Allocator" 메모리 카테고리에 대한 메모리 블록의 동작을 제어하여 기본 메모리 블록을 할당하고 해제하는 데 사용할 수 있습니다. 버퍼 초과를 감지하고 사용 전후에 할당된 메모리를 확실한 잘못된 값으로 지우는 디버그 설정도 사용할 수 있습니다. AK::BookmarkAlloc::GetStats 를 사용하면 "Bookmark Allocator"가 어떻게 사용되고 있는지에 대한 정보를 얻을 수 있습니다.
다음은 게임 요구 사항이나 프로파일링 중에 관찰된 다른 동작에 따른 몇 가지 제안 사항입니다.
AK::BookmarkAlloc::Stats::uRecentBlocksFetched
의 높은 값은 다중 스레드 환경에서 과도한 스레드 경합을 초래할 수 있습니다. 따라서 "Bookmark Allocator"에서 사용하는 블록이 더 크고 임시로 새 블록을 자주 요청할 필요가 없도록 AK::BookmarkAlloc::InitSettings::uMinimumBlockSize
를 늘리는 것이 바람직할 수 있습니다. AK::BookmarkAlloc::Stats::uRecentPeakMemUsed
를 사용하면 최소 블록 크기가 얼마인지 결정하는 데 도움이 됩니다.AK::BookmarkAlloc::Stats::uPeakMemUsed
를 측정하여 AK::BookmarkAlloc::InitSettings::uMinimumBlockSize
의 크기를 줄일 수 있습니다.AK::BookmarkAlloc::InitSettings::uMaximumUnusedBlocks
를 늘리는 것이 좋습니다. 또는 AK::BookmarkAlloc::InitSettings::uMinimumBlockSize
를 늘려서 작업에서 획득한 첫 번째 블록만 필요한 것으로 만들 수 있습니다. 프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.
Wwise를 시작해 보세요