이 항목의 내용
소개
Microsoft Game Development Kit(GDK)는 낮은 처리 및 메모리 오버헤드를 유지하면서 고도로 사용자 지정 및 제어할 수 있는 실행 동작을 제공하도록 설계된 새로운 비동기 프로그래밍 모델을 도입했습니다. Microsoft Game Development Kit(GDK)의 모든 비동기 API 호출은 일관성을 제공하기 위해 이 모델을 사용합니다. 그러나 비동기 라이브러리는 작업 큐잉 및 디스패치를 관리하기 위해 사용자 고유의 작업 및 비동기 시스템에서 직접 사용할 수 있습니다. 이전 XBOX One Software Development Kit 비동기 모델과 개발자 피드백으로부터 배운 Microsoft Game Development Kit(GDK)의 새로운 솔루션은 비동기 작업이 실행되는 방식과 위치를 완벽하게 제어할 수 있게 해 줍니다. 단일 스레드의 동기 실행이든 매우 특정한 우선 순위와 어피니티 마스크를 가진 타이틀 스레드에서의 병렬 실행이든 모든 스레딩 설계를 사용할 수 있습니다. XBOX One Software Development Kit는 시스템 스레드 풀만 사용했습니다. Microsoft Game Development Kit(GDK)의 패러다임 전환은 Win32 스타일의 플랫 C 또는 간단한 C++ API를 사용하여 XBOX One Software Development Kit 솔루션을 개선합니다. 이를 통해 메모리 할당 및 해제 타이밍을 직접 관리할 수 있습니다. 성능을 더 쉽게 검사할 수 있으며, 대부분의 API 호출(및 작업 실행에 사용되는 모든 비동기 라이브러리 API 호출)에는 고성능 보장이 함께 제공됩니다.설계 목표
비동기 라이브러리는 타이틀이 API 또는 시스템의 최소 오버헤드로 최대 성능을 얻을 수 있도록 몇 가지 핵심 목표를 가지고 설계되었습니다. 다음 목록에는 몇 가지 상위 수준의 목표가 포함되어 있습니다.- 비동기 코드는 일관되며 이해하고 식별하기 쉽습니다.
- 콜백 실행 동작을 자유롭게 완전히 관리할 수 있습니다.
- 원하는 방식으로 스레드를 사용할 수 있습니다.
- 성능과 메모리 사용량이 일관되고 관리하기 쉽습니다.
- 작업 실행을 위한 시스템 오버헤드가 낮고 주 스레드에서 사용할 수 있습니다.
- 비동기 라이브러리는 Microsoft Game Development Kit(GDK) API 사용에만 국한되어서는 안 됩니다.
일관되고 크로스 플랫폼
일관성은 비동기 API가 작성되고 작동하는 방식에 대해 다음과 같은 기대치를 제공합니다.- 메서드와 데이터는
X접두사와 라이브러리 이름을 갖습니다. - 일반 오류는 HRESULT 오류 코드를 통해 보고됩니다.
- Microsoft Game Development Kit(GDK) 전체의 모든 비동기 호출은 XAsyncBlock을 사용합니다.
- 비동기 Microsoft Game Development Kit(GDK) 시작 메서드는
Async접미사를 갖습니다. - 비동기 Microsoft Game Development Kit(GDK) 결과 메서드는
Result접미사를 갖습니다.
완전한 개발자 제어
새로운 비동기 라이브러리의 중요한 부분은 타이틀에 가장 적합한 사용을 활성화할 수 있도록 완전한 제어권을 가진다는 것입니다. 즉, 다음을 포함한 모델의 많은 부분이 사용자 지정 가능합니다.- 작업 큐의 콜백을 자동 또는 수동으로 디스패치할 수 있습니다.
- 완료 콜백은 선택 사항이며 폴링을 사용할 수 있습니다.
- 기본 프로세스 작업 큐를 변경하거나 제거할 수 있습니다.
- 사용자 지정 비동기 공급자를 구현하여 작업 관리 흐름을 변경할 수 있습니다.
작업 큐가 지정되지 않았을 때 타이틀에서 사용하는 기본 작업 큐는 XTaskQueueSetCurrentProcessTaskQueue를 사용하여 대체할 수 있습니다. 작업 큐가 항상 지정되도록 하려면
nullptr과 함께 해당 함수를 사용하여 기본 큐를 제거할 수도 있습니다. 이 경우 작업 큐가 지정되지 않으면 오류가 발생합니다.
작업이 완료될 때를 알기 위해 비동기 호출에 폴링을 사용하는 것을 선호하는 경우, XAsyncGetStatus를 사용하여 반환 코드를 확인할 수 있습니다.
모든 스레딩 상황
작업 큐 포트가 수동 디스패치를 사용하도록 구성된 경우 포트가 언제 어떻게 디스패치되는지에 대한 제한이 없습니다. 비동기 라이브러리는 구현에서 스레드로부터 안전하므로 잠금 없이 사용자 지정 스레딩 및 동시성 동작이 발생할 수 있습니다. 크리티컬 섹션, 인터록된 작업 및 기타 관련 다중 스레딩 구문은 비동기 시스템이 아닌 콜백 내에서 사용되는 사용자 데이터를 보호하는 데만 필요합니다. 자체 스레드를 사용하는 경우 구현 사례에 필요한 어떤 것이든 어피니티 마스크와 스레드 우선 순위를 설정할 수 있습니다. Windows 메시지 루프를 사용하여 디스패치를 처리할 수도 있습니다. 수동 포트 내의 태스크 콜백 실행 동작은 그림 1 및 그림 2와 같이 XTaskQueueDispatch를 호출하도록 스레드가 설정된 방식에 완전히 의존합니다. 그림 1. 하나의 스레드의 콜백 실행 동작을 보여 줍니다

XBOX One Software Development Kit로부터의 개선 사항
여러분의 피드백에 대응하고 과거 솔루션을 개선하는 것은 Microsoft Game Development Kit(GDK)에 매우 중요합니다(NDA 항목). 다음 하위 섹션에서는 XBOX One Software Development Kit의 비동기 프로그래밍과 비교하여 이루어진 몇 가지 주요 개선 사항을 나열합니다.더 이상 C++/CLI(WinRT) 없음
XBOX One Software Development Kit는 비동기 함수 동작을 위해 C++/CLI(WinRT) 사용을 요구했습니다. 이를 통해 시스템은 리소스 누수 및 오류와 같은 문제를 겪지 않고 XBOX 서비스 및 기타 서비스에 대한 호출을 관리했습니다. 그러나 이는 또한 새로운 코딩 구문을 배우고 시스템의 암묵적인 시간 분할 및 리소스 사용을 고려해야 했습니다. Microsoft Game Development Kit(GDK) 비동기 모델은 비동기 라이브러리에 대해 Win32 스타일의 C 스타일 API 모델로 패러다임을 전환합니다. Microsoft Game Development Kit(GDK) 코드는 관리되는 WinRT 생태계를 통합하지 않고도 C/C++ 프로젝트에서 직접 사용할 수 있습니다. 결과적으로 모든 할당과 동작은 격리되고 잘 이해되며 시스템 스레드의 백그라운드 동작이 최소화됩니다.스레딩 동작에 대한 완전한 제어
XBOX One Software Development Kit는 비동기 호출을 처리하는 단일 방법이 있었고, 그것은 시스템 풀 스레드에서 동시에 실행하는 것이었습니다. 제어 범위는 시스템 스레드 풀을 조정하는 것으로 제한되었습니다. Microsoft Game Development Kit(GDK)에서 스레딩은 XBOX One Software Development Kit에서 설명한 대로 시스템 스레드 풀을 사용하거나, 애플리케이션에 대한 동작을 구축하도록 수동 스레딩으로 사용자 지정할 수 있습니다. 수동 스레딩에서는 XTaskQueueDispatch가 호출되는 방식과 시기에 따라 콜백 실행 동작이 결정됩니다. 이 함수가 하나의 스레드에서만 호출되면 해당 스레드에서 실행되는 동기 동작이 됩니다. 여러 스레드가 동시에 이 함수를 호출하면 각 호출은 작업 큐에서 다른 콜백을 받고 병렬로 실행합니다. 여러 콜백 실행 동작은 이 항목의 완전한 개발자 제어 섹션에서 설명했습니다.예외 대신 오류 코드
Microsoft Game Development Kit(GDK)는 새로운 기술과 오래된 기술을 모두 아우릅니다. 결과적으로 오류 처리는 라이브러리마다 다를 수 있습니다. 비동기 라이브러리는 “예외 없음”으로 설계되었습니다. 즉, 호출 오류, 흐름 제어, 상태 보고 또는 다른 런타임 목적에 예외가 사용되지 않습니다. 타이틀에서 자체 예외 처리를 사용할 수 있습니다. 대부분의 오류 및 상태 코드는 이제 표준 Win32 코딩 스타일에서HRESULT 코드를 통해 보고됩니다. 결과 상태 코드가 중요하지 않은 경우 부울(Boolean)을 사용할 수 있습니다. API 메서드가 일반적인 오류를 생성할 것으로 예상되는 경우, 해당 오류는 원인에 대한 설명과 함께 문서에 나열됩니다.
HRESULT 코드가 사용되므로 코드를 확인하는 간단한 패턴은 Windows SUCCESS() 및 FAILED() 매크로를 사용하는 것입니다. 진행 방법을 결정하기 위해 특정 오류 코드를 확인할 때 HRESULT 값을 확인할 수 있습니다.
Microsoft Game Development Kit(GDK)의 오류 처리에 대한 자세한 내용은 Microsoft Game Development Kit의 오류 처리를 참조하세요.
가비지 컬렉션 없음
Microsoft Game Development Kit(GDK)에는 C++/CLI(WinRT) 지원이 없기 때문에 런타임 동안 백그라운드에서 발생하는 가비지 컬렉션도 없습니다. 추적되는 모든 OS 할당은 직접HANDLE 개체 또는 라이브러리에서 제공하는 사용자 지정 핸들 typedef로 표현됩니다.
핸들을 사용하여 할당/해제 타이밍, 동작 및 성능이 호출자에 의해 관리되도록 설정할 수 있습니다. 이러한 할당과 해제는 성능 히치를 피하기 위해 지원 로더 스레드로 이동할 수 있습니다. 성능이 가장 중요할 때 예기치 않게 해제가 발생하지 않습니다.
그러나 리소스 추적과 메모리 누수 방지는 사용자의 책임이 됩니다. 할당된 핸들이 더 이상 필요하지 않을 때는 반드시 해제해야 합니다.
보장된 고성능
XBOX One Software Development Kit 비동기 모델은 관리되는 COM 프레임워크를 사용함으로써 때때로 설명하기 어려운 예기치 않은 메모리 및 성능 문제로 이어지는 경향이 있었습니다. 그러나 Microsoft Game Development Kit(GDK) 모델은 일관된 성능과 메모리 사용량을 보장합니다. 스레딩을 제어할 수 있기 때문에 프로파일러나 사용자 지정 코드를 사용하여 시스템 호출의 성능을 더 쉽게 검사할 수 있습니다. ATG 비동기 프로그래밍 샘플에는 소요된 시간의 일부를 측정하기 위한 기본 제공 테스트가 있습니다. 그림 3의 차트는 사용자 지정 비동기 공급자로 비동기 작업을 관리하는 데 소요된 시간을 측정합니다. 테스트에 사용되는 사용자 지정 스레드는 콜백을 가능한 한 빠르게 실행합니다. 그림 3. 비동기 시스템 오버헤드를 측정하는 차트를 보여 줍니다
시간에 민감한 스레드
시간에 민감한 스레드는 Microsoft Game Development Kit(GDK)가 차단이나 예기치 않게 오래 실행되는 작업을 원하지 않는 타이틀 스레드를 식별하기 위해 사용하는 새로운 사양입니다. 사용자는 XThreadSetTimeSensitive 호출로 타이틀 스레드를 시간에 민감한 것으로 표시할 수 있습니다. 스레드가 시간에 민감한 것으로 표시되면 일관되고 신뢰할 수 있는 런타임 성능을 제공하지 않는(즉, “시간에 민감하며 안전”하지 않은) 해당 스레드의 모든 Microsoft Game Development Kit(GDK) API 메서드 호출은 디버그 어설션을 트리거합니다. 이러한 시간에 민감하며 안전한 메서드에는 구현 측면에서 다음과 같은 보장이 포함됩니다.- 온디맨드 로드나 초기화가 수행되지 않습니다.
- VM 또는 프로세스 경계를 넘는 호출이 이루어지지 않습니다.
- 메모리 할당이 제한됩니다.
Microsoft Game Development Kit(GDK) API 호출을 넘어선 일반적인 사용
Microsoft Game Development Kit(GDK)용 비동기 라이브러리는 일반적이며 API 호출 사용에만 국한되지 않습니다. Microsoft Game Development Kit(GDK)에서 제공하는 모든 비동기 호출은 내부적으로 비동기 라이브러리를 사용하며 작업 시작 및 결과 가져오기를 포함한 작업에 대해 일관된 메서드를 제공합니다. GDK가 아닌 API 목적으로 라이브러리를 사용하는 방법에 대한 자세한 내용은 샘플 코드를 참조하세요. 이 설정에서 비동기 작업 시작은 Microsoft Game Development Kit(GDK) 함수든 사용자 지정 패턴이든 동일한 프로세스입니다. 작업을 위해 XAsyncBlock이 설정된 다음 작업이 시작됩니다. 작업 시작은 Microsoft Game Development Kit(GDK) API 함수이거나 사용자 지정 타이틀 메서드일 수 있습니다. 타이틀 전반에 걸쳐 어떤 비동기 목적으로든 비동기 라이브러리를 자유롭게 사용하세요.참고 API 문서
- XAsync(API 콘텐츠)
- 함수
- 구조체
- XAsyncProvider(API 콘텐츠)
- XTaskQueue(API 콘텐츠)
- xuser(API 콘텐츠)
- xgamesave(API 콘텐츠)
- xpackage(API 콘텐츠)
- xgameui(API 콘텐츠)
- xthread(API 콘텐츠)
