버전

menu_open
Wwise SDK 2019.1.11
Audiokinetic Stream Manager 초기화 설정

Default Streaming Manager Information

이번 장에서는 고급 Stream Manager의 API 기본 구현을 중점적으로 설명합니다.

Stream Manager와 AK::StreamMgr::Create() 메소드의 초기화 설정은 Audiokinetic의 구현에 특화돼있으며 AkStreamMgrModule.h 에 정의돼있습니다.

다음은 Stream Manager 기본 구현의 초기화 설정에 대한 설명입니다. I/O와 메모리 리소스를 최대한 활용하기 위해 어느 시점에서는 자신의 게임에 맞는 설정으로 변경해야할 것입니다.

Stream Manager 설정

AkStreamMgrSettings 구조체는 전체 Stream Manager에 적용할 설정을 정의합니다. 각 세부 항목에 나와 있는 기본 값은 AK::StreamMgr::GetDefaultSettings() 에 의해 반환된 값입니다. 사용자의 시스템에는 이 기본 값이 적합하지 않을 수 있습니다. I/O 도움말, 문제 해결 및 최적화 에 나온 정보를 참고하면 최적값을 선택하는 데 도움이 될 것입니다.

Memory Size

AkStreamMgrSettings::uMemorySize specifies the size of the memory pool that the Stream Manager will create for itself and all its small objects: streaming devices, stream objects, pending transfer objects, references to stream buffers, profiler stream names, deferred file open commands, and so on. That is, everything except the I/O memory for automatic streams, whose pool is specific to each streaming device (specified by AkDeviceSettings::uIOMemorySize). It should be the smallest value possible, but large enough so that it does not restrict the number of streams that can be played. You may use the Memory tab in Wwise’s Advanced Profiler view to evaluate small streaming object memory usage (in the Stream Manager pool).

Most of the memory required from this pool is allocated when streaming devices are created. Run-time allocations essentially consist of the stream objects themselves, their profiling names (in DEBUG and PROFILE configurations only), and temporary structures needed to handle deferred file opening (see 지연 열기) if applicable.

Default: 64 KB.

스트리밍 장치 설정

AkDeviceSettings 구조체는 각 장치에 필요한 설정을 정의하며, AK::CreateDevice() 로 생성됩니다. 각 세부 항목에 나와 있는 기본 값은 AK::StreamMgr::GetDefaultDeviceSettings() 에 의해 반환된 값입니다. 사용자의 시스템에는 이 기본 값이 적합하지 않을 수 있습니다.

I/O 메모리 크기

AkDeviceSettings::uIOMemorySize 는 장치의 자동 스트리밍에 예약된 메모리의 전체 크기입니다. 이 장치는 자동 스트림 I/O 데이터가 작성되는 특수 메모리 풀을 생성합니다. 자동 스트림을 사용하지 않는 경우, 0으로 지정하세요. 그러나 사운드 엔진은 스트리밍된 오디오 파일을 재생할 때 자동 스트림을 사용한다는 점에 유의하세요. AkDeviceSettings::pIOMemoryAkDeviceSettings::uIOMemoryAlignment, AkDeviceSettings::ePoolAttributes 는 풀 생성 메소드, 즉 AK::MemoryMgr::CreatePool() 로 직접 전달되는 추가 매개 변수입니다.

기본값:

세분성

세분성은 AkDeviceSettings::uGranularity 로 지정됩니다. 이는 Low-Level I/O로 전송된 표준 요청 크기가 표준 스트림(조각 작업)에서 전송되는지 자동 스트림(단일 스트림 버퍼 크기)에서 전송되는지를 정의합니다. 자동 스트림은 사용 가능한 메모리에 따라 버퍼 개수 변수를 사용합니다. 자동 스트리밍에 사용할 수 있는 버퍼의 총 개수는 다음과 같습니다.
AkDeviceSettings::uIOMemorySize / AkDeviceSettings::uGranularity.

작은 정보: 메모리 고갈을 방지하려면 스트림이 최소한 이중 버퍼여야 합니다. 따라서 I/O 메모리 크기는 최소한 다음으로 설정돼야 합니다.
2 * uGranularity * nominal_number_of_streams
스트림별로 필요한 버퍼의 실제 개수는 동적이며, 스트림 휴리스틱과 장치의 대상 버퍼 길이에 따라 다릅니다 (AkDeviceSettings::fTargetAutoStmBufferLength 참고). 자신에게 맞는 I/O 메모리 크기를 결정하는 올바른 방법은 최악의 상황에서 모든 스트림에 필요한 총량을 계산해 fTargetAutoStmBufferLength로 곱하는 것입니다. 실제로 큰 값에서 시작한 다음 Wwise 프로파일러로 자신의 게임을 프로파일링한 후 Streaming Devices 탭에서 I/O 사용량으로 보고되는 최고값을 사용하는 것이 쉽습니다.

기본값: 16 KB

스케줄러 타입

스트리밍 장치 스케줄러의 타입은 AkDeviceSettings::uSchedulerTypeFlags 에 의해 결정됩니다. Low-Level I/O로 핸드셰이킹 모드를 결정합니다. Streaming devices created with AK_SCHEDULER_BLOCKING flag work with AK::StreamMgr::IAkIOHookBlocking, using synchronous handshaking. Streaming devices created with the AK_SCHEDULER_DEFERRED_LINED_UP flag work with AK::StreamMgr::IAkIOHookDeferred, using asynchronous handshaking. 상위 레벨 장치 스케줄러에 대한 자세한 내용은 상위 레벨 장치 지정 을(를) 참고하세요.

경고: AK_SCHEDULER_BLOCKING 장치와 연결된 지연 I/O를 사용하면 런타임 강제 종료가 발생할 수 있습니다.

기본값: AK_SCHEDULER_BLOCKING

I/O 스레드 속성

모든 상위 레벨 장치는 'AK::IOThread'를 호출한 Low-Level I/O 로 전송 요청을 게시할 때 별도 스레드를 사용합니다. AkDeviceSettings::threadProperties 를 이용해 이 스레드의 속성을 지정할 수 있습니다. AkThreadProperties 는 SDK/include/AK/Tools/{Platform name}/AkPlatformFuncs.h에서 각 플랫폼에 대해 정의됩니다. 이 메소드는 일반적으로 스레드 우선 순위와 프로세서를 지정합니다.

작은 정보: I/O 스케줄러 스레드는 CPU를 많이 사용하지 않기 때문에 평균 이상의 우선 순위를 가져야 합니다. I/O 스케줄러 스레드는 대부분의 경우 스트림 작동을 기다리거나 디스크 제어 장치를 기다립니다. 그러나 작업을 선택해 이를 Low-Level I/O로 발송할 때는, 저장 장치 처리량을 최대화하기 위해 가능한 빠르게 처리해야 합니다.

기본값: 기본 플랫폼별 스레드 속성 (AKPLATFORM::AkGetDefaultThreadProperties()에 의해 반환)으로, AK_THREAD_PRIORITY_ABOVE_NORMAL (AkPlatformFuncs.h에서 정의)과 동일한 우선 순위.

대상 버퍼링 길이

AkDeviceSettings::fTargetAutoStmBufferLength 는 장치의 I/O 스케줄러를 위한 휴리스틱입니다. 이는 자동 스트림에만 적용됩니다. 스트림별 가장 적합한 버퍼링 시간을 밀리세컨드 단위로 지정합니다. Stream Manager는 버퍼링 길이에 도달할 때까지 주어진 스트림에 대해 I/O를 실행합니다. 시간 값은 스트림의 처리량 휴리스틱을 사용해 버퍼 크기로 해석됩니다. 예를 들어, 44.1 kHz로 샘플링된 16 비트 스테레오 사운드는 172.3 KB/s의 처리량을 필요로 합니다. 만약 대상 버퍼 길이가 380 ms로 설정된 경우, 이 스트림의 대상 버퍼 크기는 약 64 KB가 됩니다. 버퍼링이 많을수록 스트림은 자원이 고갈될 확률이 낮아집니다. 반면 I/O 스케줄러의 처리량은 더 많아지고 CPU를 더 많이 사용하게 되며, 스트리밍 I/O 풀에서 더 많은 메모리를 사용합니다. 최적의 값은 하위-레벨 저장 장치 대역폭과 스트리밍이 사용할 수 있는 메모리 양에 의해 좌우됩니다. 빠른 장치는 적은 버퍼링 길이를 사용하며, 반대로 느린 장치나 처리량의 표준 편차가 큰 장치는 (탐색 등의 이유로) 큰 값을 사용합니다. 모든 자동 스트림이 대상 버퍼링 길이에 도달한 경우, 그리고 지연 표준 스트리밍 작업이 없는 경우, I/O 스케줄러는 idle 상태가 됩니다.

작은 정보: 최적의 대상 버퍼링 길이는 자신의 하위 레벨 장치가 데이터를 보내는 시간에 비례합니다. 적절한 사용 환경에서 충분한 I/O 메모리 크기로 Wwise Profiler에서 음원 고갈 알림이 뜨지 않을 때까지 최대한 낮은 값을 지정하도록 해보세요. 이 작업을 거치면 I/O 메모리 크기를 최대 사용 값까지 줄일 수 있습니다.

기본값: 380 ms.

동시 I/O 전송 최대 개수

AkDeviceSettings::uMaxConcurrentIO 는 비동기 하위 레벨 장치만 관련이 있습니다 (AK_SCHEDULER_DEFERRED_LINED_UP 스케줄러 플래그). 어떤 시점이든 스트리밍 장치가 하위 레벨 I/O로 동시에 게시할 수 있는 하위 레벨 I/O 전송의 최대 개수입니다. 한계에 도달하면, 대상 이하로 버퍼링 되는 스트림이 있다 하더라도 I/O 스레드가 하위 레벨 I/O로 발송하던 요청을 중단하게 됩니다. 이 값을 이용해 지연된 전송을 추적해야 하는 구조체의 정적 배열을 안전하게 할당할 수 있습니다.

작은 정보: 1로 지정하면 동기화 장치(AK_SCHEDULER_BLOCKING 스케줄러 플래그)와 동일한 작동을 하지만 비동기화 핸드셰이킹을 사용합니다. 이는 자신의 I/O 관리자가 비동기 API만을 나타낼 경우 유용합니다.

이 매개 변수에 큰 값을 사용하고 싶겠지만, 여기에는 단점이 있습니다. 스트리밍 장치의 스케줄러는 요청들을 검사할 때 각 스트리밍의 상태에 따라 하위 레벨 요청을 발송합니다. 많은 요청을 전송하게 두고 하위 레벨 I/O에 오랫동안 남겨두면, 그 사이 상황이 바뀔 가능성이 많습니다. 예를 들어 스트리밍 사운드가 멈추거나 반복 재생을 중단할 수 있습니다. 이런 경우, 이들 전송은 취소되며 I/O 데이터가 받는 순간 지워집니다. 이는 대역폭을 크게 낭비할 수 있습니다.

많은 양의 동시 요청은, 요청의 양과 상관 없는 처리량을 지닌 장치에만 사용돼야 합니다. 예를 들어 일부 DMA 제어기는 많은 전송을 처리하도록 프로그래밍될 수 있지만, 전송을 완료한 순간은 프로그래밍 된 전송량과 거의 상관이 없습니다.

기본값: 8 (ignored by AK_SCHEDULER_BLOCKING 스케줄러).

Maximum Cache Ratio

AkDeviceSettings::fMaxCacheRatio determines whether data caching is enabled or not: with values greater than 1, caching is enabled.

스트리밍 장치는 스트리밍 풀로의 데이터 캐싱을 지원합니다. 메모리 블록에 대해 I/O 작업이 실행될 때 파일 메타데이터가 연결됩니다. 동일한 스트림이나 동일한 스트림의 다른 인스턴스가 같은 파일에 해당되는 데이터 블록을 거의 같은 위치에 필요로 하는 경우, 이 데이터 블록은 직접 사용되어 하위 레벨 I/O로부터의 전송을 피하게 됩니다.

중요한 데이터 구조체는 장치가 생성될 때 사전에 할당된다는 점을 기억하세요 (Stream Manager 메모리 풀로부터 할당됨). 런타임에 메모리가 고갈되면 I/O 스레드가 아무 것도 없이 높은 우선 순위로 돌아가기 때문에 게임 성능에 치명적인 영향을 미칠 수 있습니다.

스트림 데이터 캐싱을 이용하면 주어진 메모리 블록에 대해 하나 이상의 레퍼런스가 있을 수 있습니다. 메모리 블록의 레퍼런스는 사전에 할당된 중요한 데이터 구조체 중 하나의 예제입니다.

AkDeviceSettings::fMaxCacheRatio specifies how much references there are compared to the number of memory blocks. When AkDeviceSettings::fMaxCacheRatio is 1, there is exactly one reference per memory block, thus data caching cannot occur. If you consider that caching is not needed for a given device, you should leave AkDeviceSettings::fMaxCacheRatio to 1. Data look-up is skipped completely with this setting.

If you set AkDeviceSettings::fMaxCacheRatio to 2, there will be twice as much references as there are memory blocks, and caching will occur. The streaming device will have a slightly larger memory footprint in the Stream Manager pool when you create it with this setting. In order to determine whether this cache ratio is sufficient for your needs, profile your game using the Wwise Profiler. In the Streaming Devices tab of the Profiler, the value in the column Caching Available indicates how much of these extra references are left. When it reaches 0, no more caching can occur because the device has to respect the amount of preallocated references. At this point, even if valid data exists in the streaming cache, a new streaming buffer is refilled from the low-level I/O. So if you notice that the Caching Available often decreases close to 0 during your profiling sessions, you should consider increasing AkDeviceSettings::fMaxCacheRatio above 2 in order to optimize your usage of the data caching feature.

Default: 1 (caching disabled).


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

지원이 필요하신가요?

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

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

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

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

Wwise를 시작해 보세요