버전
menu_open
경고 : 이 페이지에서 보호된 일부 정보가 표시되지 않았습니다.
특정 플랫폼의 라이선스 사용자일 경우 로그인하셨는지 확인해 주세요.
Wwise SDK 2023.1.3
메모리 매니저

Wwise 사운드 엔진의 모든 모듈은 AK::MemoryMgr 인터페이스를 통해 메모리에 접근합니다. 사운드 엔진의 클라이언트는 이 인터페이스의 초기화와 종료 처리를 해야 합니다.

SDK에 정적 라이브러리(AkMemoryMgr.lib)로 기본 구현이 제공돼있습니다. 이 라이브러리를 사용하려면 클라이언트가 AkModule.h 헤더를 포함하고 AK::MemoryMgr::Init 초기화 함수를 호출해야 합니다.

AkMemoryMgr.lib 와 다른 라이브러리의 사용법에 더 자세한 정보는 빌드 환경 설정 를 참고하세요.

초기화

기본 구현에서 기본 초기화 설정은 AK::MemoryMgr::GetDefaultSettings 를 이용해 구할 수 있습니다.

Memory Manager가 할당한 가상 메모리와 장치 메모리의 총량을 제한하기 위해서는 다음 설정을 사용하세요.

다음 설정을 사용해 추가적인 런타임 디버깅 기능을 활성화할 수 있습니다.

이 불분명한 값으로 커스텀 구현하면 원하는 만큼의 메모리 디버깅을 정의할 수 있습니다. 기본 구현에는 두 개의 레벨이 있습니다.

  • 레벨 1은 기본 런타임 메모리 디버깅을 활성화합니다. 여기에는 각 할당의 FILE__과 __LINE 캡처, 각 할당의 호출 스택 추적 (가능한 경우), 정지시 자세한 누수 보고 및 간단한 무결성 확인 같은 것들이 포함됩니다. 레벨 1은 매우 가벼운 편이기 때문에 개발 도중에 기본적으로 실행해도 됩니다.
  • 레벨 2는 스톰프 할당자 사용을 활성화하여, 각각의 할당에 대해 가상 메모리의 별도 페이지를 사용해 범위를 벗어난 쓰기를 찾아냅니다. 이 과정은 매우 더디고 리소스 부족 모드가 될 수 있으므로, 메모리 스톰프의 원인을 추적할 때를 제외하고는 개발 중 기본으로 활성화해두는 것을 권장하지 않습니다.

모든 할당을 파일로 덤프하려면 다음을 사용하세요 (이 때 AkMemSettings::uMemoryDebugLevel 는 1이어야 하며 Release 설정이 아니어야 합니다).

주의: 사운드 엔진은 AK::IAkStreamMgr::CreateStd() 를 이용하는 쓰기를 위해 스트림을 엽니다. Stream Manager의 기본 구현을 사용하고 있다면, Low-Level IO 인터페이스 AK::StreamMgr::IAkLowLevelIOHook::BatchOpen() 의 구현에서 파일 열기가 실행됩니다.

디버깅 목적으로 할당 추적을 실행하려면 다음 설정을 사용하세요 (Release 설정에서는 호출되지 않음).

위에 나온 디버그 함수는 아래의 실제 할당 함수를 대체하지 않으며, 다양한 메모리 할당 이벤트의 알림 콜백입니다.

기본 구현의 rpmalloc 사용을 커스텀 할당자로 오버라이드하려면 다음 설정을 사용하세요.

AkMemType_Device 비트가 설정됐을 때 위의 할당 함수가 장치 메모리를 반환함으로써 이 비트를 받도록 해야 합니다. 장치 메모리 할당은 일부 플랫폼에서만 사용하며, 특정한 매개 변수를 따릅니다. 자세한 내용은 별도의 플랫폼별 섹션을 참고하세요.

PS5에서, 추가 플래그로 보호된 장치 메모리 페이지를 반환하는 것이 매우 중요합니다. PS5에서 장치 메모리 할당 함수를 올바르게 구현하는 방법에 대해서는 메모리 매핑 요구 사항 을 참고하세요.

Xbox One에서, APU 함수로 할당된 메모리 페이지를 반환하는 것이 매우 중요합니다. Xbox One에 장치 메모리 할당 함수를 올바르게 구현하는 방법에 대해서는 APU 메모리 을(를) 참고하세요.

Xbox Series X에서, APU 함수로 할당된 메모리 페이지를 반환하는 것이 매우 중요합니다. Xbox Series X에 장치 메모리 할당 함수를 올바르게 구현하는 방법에 대해서는 APU 메모리 를 참고하세요.

rpmalloc 하위의 페이지 할당 메커니즘을 오버라이드하거나 제어하려면 다음 설정을 사용하세요.

커스텀 할당이 rpmalloc을 오버라이드하도록 설정된 경우 위의 함수들은 호출되지 않습니다. 장치 메모리 할당은 일부 플랫폼에서만 사용하며, 특정한 매개 변수를 따릅니다. 자세한 내용은 별도의 플랫폼별 섹션을 참고하세요. 반환된 메모리의 정렬이 플랫폼의 자연 정렬(예: Windows의 64KB)과 일치하지 않을 경우 이 커스텀 정렬은 uVMPageSize and uDevicePageSize 에 지정되어야합니다.

AK::MemoryMgr::InitForThread() 를 호출한 스레드에서, uMaxThreadLocalHeapAllocSize보다 작은 할당은 전부 스레드 로컬 힙으로 이동합니다. 이 값보다 큰 할당은 글로벌 힙으로 가며, 모든 스레드와 공유합니다. uMaxThreadLocalHeapAllocSize 의 기본값은 0이며, 이에 따라 기본적으로 모든 할당은 글로벌 힙으로 갑니다. 멀티 스레드 CPU 활동이 많은 시간 동안 글로벌 힙의 접근 경합이 상당한 수준으로 발생할 수 있습니다. 이런 경우 메모리를 더 많이 사용하는 대신 CPU 경합을 완화하기 위해 uMaxThreadLocalHeapAllocSize의 값을 384, 512, 또는 그 이상으로 설정하는 것이 좋습니다.

자신의 게임에서 Memory Manager의 초기화에 대한 더 자세한 정보와 예제 코드를 보려면 예제 를 참고하세요.

SoundBank 메모리 사용에 대한 더 자세한 정보는 뱅크 로딩 을 참고하세요.

메모리 할당 최적화에 대한 더 자세한 정보는 메모리 할당 최적화 를 참고하세요.

메모리 매니저 오버라이딩

클라이언트가 직접 AK::MemoryMgr 인터페이스를 커스텀 구현할 수 있습니다. AkMemoryMgr.h 에 정의된 모든 함수가 구현돼야 합니다. AkModule.h 에 정의된 AK::MemoryMgr 네임스페이스의 함수는 메모리 관리자의 기본 구현에 대해 만들어졌기 때문에 따로 구현할 필요가 없습니다.

'AkMemSettings'의 다양한 할당 함수를 오버라이드할 때와 같이, 새로운 AK::MemoryMgr 구현을 작성할 때, AkMemType_Device 비트가 설정됐을 때 장치 메모리를 반환함으로써 이 비트를 받도록 해야 합니다. 장치 메모리 할당은 일부 플랫폼에서만 사용하며, 특정한 매개 변수를 따릅니다. 자세한 내용은 별도의 플랫폼별 섹션을 참고하세요.


이 페이지가 도움이 되었나요?

지원이 필요하신가요?

질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!

지원 페이지를 방문해 주세요

작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.

프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.

Wwise를 시작해 보세요