다음을 통해 공유


GameInput 장치

시스템에 연결된 모든 물리적 입력 장치는 IGameInputDevice 인터페이스로 표시됩니다. 읽기와 마찬가지로 장치 인스턴스는 참조 수가 계산되는 싱글톤입니다. 즉 인터페이스 포인터가 같은지 비교할 수 있습니다. 일반적인 애플리케이션의 입력 코드는 대부분 이러한 방식으로만 장치 인스턴스를 사용합니다. 다른 API를 호출할 때 장치 식별자(예: 읽기를 검색할 때의 필터)로 사용하는 것입니다.

IGameInputDevice 인터페이스 메서드는 일반적으로 응용 프로그램에서 특정 장치와 어떤 식으로든 직접 상호 작용해야 하는 경우에만 호출됩니다. 가장 일반적인 이유는 촉각 또는 힘 피드백 명령을 장치에 보내는 것입니다. 그러나 이 인터페이스는 장치 속성도 노출시키고 보다 고급 코드가 필요할 수 있는 하위 수준 장치 I/O에 액세스할 수 있도록 합니다.

장치 속성

장치에 대한 특정 세부 정보를 알아야 하는 응용 프로그램은 장치의 GameInputDeviceInfo 구조에 액세스할 수 있습니다. 이 구조에는 장치에 대한 풍부한 정보가 포함되어 있지만 이를 사용할 때 이해해야 하는 몇 가지가 있습니다.

디바이스 정보가 클 수 있으며 경우에 따라 10KB 이상일 수 있습니다. 효율성 때문에 GameInput API는 장치 데이터의 사본을 만들지 않고 일시적으로 GameInput 내에 저장된 데이터에 대한 직접 액세스 권한을 애플리케이션에 부여합니다. 이 접근 방식은 버퍼 할당과 많은 양의 메모리 전송을 피함으로써 성능이 높은 코드를 만듭니다. 애플리케이션이 종종 데이터의 일부에만 관심이 있기 때문입니다. 또한 이 기능을 사용하면 다양한 크기의 출력과 전체 복사로 인한 복잡함을 추가하지 않아도 GameInputDeviceInfo 구조 안에 다양한 지원 정보 배열을 찾을 수 있는 장치 정보 데이터 블록 내의 다른 지역에 대한 중첩된 포인터를 포함할 수도 있습니다.

장치 ID

장치 정보에서 사용할 수 있는 중요한 정보 중 하나는 장치의 애플리케이션-로컬 장치 ID입니다. 이는 시스템의 애플리케이션 재시작 사이나 시스템 재부팅 사이에서도 고유하게 장치를 식별하는 특별한 32바이트 값입니다. 이 ID는 무선 장치나 유선 USB 장치 연결의 연결 끊김이나 다시 연결에서도 안정적입니다. 다시 같은 USB 포트에 연결하기만 하면 됩니다.

앱-로컬 장치 ID는 애플리케이션 수명을 초과한 특정 장치를 식별하는 데 가장 일반적으로 사용됩니다. 예를 들어 입력 매핑 UI가 있는 게임은 장치 ID를 사용하여 앱이 시작될 때마다 사용자의 입력 구성이 동일한 장치에 적용되도록 합니다. 이는 그렇지 않으면 동일하게 보일 수 있는 여러 장치(예: 비행 시뮬레이터를 위한 계기판)에 걸쳐 복잡한 매핑을 지원하는 애플리케이션에 특히 중요합니다.

장치 열거형

대부분의 애플리케이션은 필요하지 않겠지만 GameInput은 연결된 장치의 명시적인 열거형을 지원합니다. 이는 IGameInput 인터페이스의 RegisterDeviceCallback 메서드를 통해 수행할 수 있습니다.

HRESULT RegisterDeviceCallback(
    _In_opt_ IGameInputDevice * device,
    _In_ GameInputKind inputKind,
    _In_ GameInputDeviceStatus statusFilter,
    _In_ GameInputEnumerationKind enumerationKind,
    _In_opt_ void * context,
    _In_ GameInputDeviceCallback callbackFunc,
    _Out_opt_ _Result_zeroonfailure_ GameInputCallbackToken * callbackToken);

이 메서드는 먼저 모든 연결된 장치에 대한 일련의 초기 콜백을 트리거한 다음 새 장치가 연결되거나 연결이 끊길 때마다 후속 콜백을 트리거하여 장치 열거형과 장치 연결/연결 해제 알림을 모두 처리합니다. 응용 프로그램에서는 GameInputEnumerationKind 매개 변수를 사용하여 모든 초기 콜백이 전송될 때까지 함수를 차단할 것인지, 아니면 바로 반환하고, 콜백이 비동기적으로 전송될지 여부를 제어할 수 있습니다.

열거형에 어떤 장치를 포함할지, 어떤 장치 상태 변경이 콜백을 트리거할지 제어하기 위해 여러 필터를 사용할 수 있습니다. 자세한 내용은 RegisterDeviceCallback을 참조하세요. 콜백이 작동하는 방식에 대한 일반적인 정보는 GameInput 콜백을 참조하세요.

집계 장치

여러 키보드가 동시에 연결되면 대부분의 입력 API는 모든 입력이 하나의 가상 시스템 키보드에서 나온 것처럼 입력을 결합하여 애플리케이션에 전달합니다. (이는 마우스에도 적용됩니다.) 그러나 GameInput은 일반적으로 각 장치와 입력을 개별적으로 전달합니다. 이 방식은 많은 가능성을 열어줍니다. 예를 들어 로컬 멀티 플레이어 게임에서 어떤 사용자의 채팅 패드가 입력되었는지 알 수 있습니다. 하지만 이러한 기능이 필요하지 않은 애플리케이션이라면 불필요하게 복잡해질 수 있습니다.

이를 해결하기 위해 GameInput은 집계 장치의 개념을 지원합니다. IGameInput 인터페이스에서 CreateAggregateDevice 메서드를 사용하면 응용 프로그램에서 단일 GameInputKind에 해당하는 모든 장치의 결합된 입력을 노출하는 가상의 IGameInputDevice 인스턴스를 만들 수 있습니다. 이제 이 집계 장치를 다른 GameInput API 함수에 대한 필터로 사용하여 집계 장치와 상호 작용(예: 읽기 검색)할 수 있습니다. 이 방법은 키보드와 마우스 입력에 가장 일반적으로 사용되지만 대부분의 다른 유형의 입력에도 사용할 수 있습니다.

참고 항목

현 릴리스에서는 CreateAggregateDevice이(가) 아직 구현되지 않았습니다.

참고 항목

GameInput 기본 사항

고급 GameInput 항목

GameInput API 참조