다음을 통해 공유


GameInput 콜백

GameInput(은)는 주로 폴링 모델을 중심으로 설계되었지만 응용 프로그램이 비동기적으로 알림을 받는 것이 최선인 경우가 있습니다. 이를 지원하기 위해 IGameInput 인터페이스는 특정 관심 이벤트가 발생할 때 호출되는 콜백 기능을 등록하는 몇 가지 방법을 제공합니다.

내부적으로 GameInput(은)는 콜백의 발송을 일련화하여 한 번에 하나의 콜백만 실행되도록 합니다. GameInput 콜백이 시간순으로 전송되도록 합니다. 이러한 보장은 응용 프로그램이 콜백 함수에 작성해야 하는 코드를 단순화합니다.

GameInput은(는) 종류에 관계없이 언제든지 최대 64개의 콜백을 등록할 수 있도록 합니다. 콜백은 GameInput의 내부 작업자 스레드에서 전송됩니다. 이 작업의 작동 방식에 대한 자세한 내용은 이 작업을 수동으로 예약하는 옵션과 함께 GameInput 작업 대기열을 참조합니다.

장치 콜백

다음 구문과 같이, 장치 콜백은 응용 프로그램이 입력 장치의 상태가 언제 변경되는지 알 수 있도록 합니다. 가장 일반적으로 장치가 연결 및 연결 해제할 때를 감지하는 데 사용되지만, 다른 상태 변동이 관심 대상일 수도 있습니다.

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);

여러 선택적 필터를 사용하여 장치 콜백을 등록할 수 있습니다. 여기에는 특정 유형의 입력을 생성하는 장치로 필터링, 특정 상태 변경으로 필터링, 특정 장치로 필터링 또는 이러한 필터 조합이 포함됩니다. 예를 들어, 애플리케이션은 장치가 시스템에서 연결이 끊어졌을 때 알림을 위해 콜백을 설정할 수 있습니다.

디바이스 상태 변경 외에도 RegisterDeviceCallback 메서드를 디바이스 열거에 사용할 수 있습니다. enumerationKind 매개 변수는 GameInputEnumerationKind 열거에서 값을 가져와서 열거가 콜백 등록의 일부로 수행되어야 하는지 여부 및 열거된 경우 열거를 차단 또는 비동기 방식으로 수행해야 하는지 여부를 나타냅니다. 장치 열거와 후속 상태 변경을 하나의 연산으로 결합하면 많은 애플리케이션이 의도하지 않게 입력 코드에서 어려움을 겪는 경합 조건을 피할 수 있습니다.

읽기 콜백

다음 구문과 같이, 읽기 콜백을 사용하면 새로운 읽기가 입력 스트림에 도달할 때마다 응용 프로그램에 알릴 수 있습니다. 많은 응용 프로그램에서 입력의 경우 폴링이 더 우수하다는 것을 알지만 이벤트 기반 입력이 더 바람직한 상황도 있습니다. 예를 들어, 게임의 주 메뉴 UI는 이벤트 기반 입력에 더 적합할 수 있습니다. 또 다른 예는 입력 매핑 UI입니다. 이 UI는 사용자가 선택하도록 메시지를 표시한 다음 입력을 기다려야 합니다.

HRESULT RegisterReadingCallback(
    _In_opt_ IGameInputDevice * device,
    _In_ GameInputKind inputKind,
    _In_ float analogThreshold,
    _In_opt_ void * context,
    _In_ GameInputReadingCallback callbackFunc,
    _Out_opt_ _Result_zeroonfailure_ GameInputCallbackToken * callbackToken);

장치 콜백과 마찬가지로 읽기 콜백도 여러 선택적 필터를 사용하여 등록할 수 있습니다. 이는 응용 프로그램이 입력 스트림에서 읽은 특정 부분에 관심이 있을 수 있기 때문에 읽기 콜백에 특히 유용합니다. RegisterReadingCallback 메서드를 사용하면 특정 유형의 입력을 생성하는 디바이스에 필터링하거나 특정 장치의 입력에 필터링할 수 있습니다.

애플리케이션은 콜백이 발생하기 전에 최소한의 이동이 필요한 아날로그 입력 값(예: 게임 패드의 엄지스틱)에 대한 필터를 지정할 수도 있습니다. 이는 고해상도 아날로그 상태 변경이 필요하지 않을 때 콜백 빈도를 크게 줄일 수 있습니다. 좋은 예는 입력 매핑 UI의 구현으로, 메시지를 표시해 사용자 선택을 요청한 후 입력 변경을 기다릴 때입니다.

콜백 등록 취소

콜백이 성공적으로 등록되면 응용 프로그램은 콜백을 실행하는 데 필요한 모든 리소스가 유효한 상태로 유지되도록 해야 합니다. 여기에는 콜백 코드와 콜백 함수 자체가 사용하는 리소스가 모두 포함됩니다. 예를 들어 콜백 함수가 DLL에서 호스팅되어 응용 프로그램이 요청에 따라 로드되고 언로드되는 경우입니다.

이러한 리소스를 안전하게 회수하려면 먼저 응용 프로그램이 Register*Callback 메서드에서 수신한 토큰을 UnregisterCallback 메서드로 전달하여 콜백 등록을 취소해야 합니다. 이 메서드가 호출될 때 콜백이 실행되면 콜백이 실행될 때까지 차단됩니다. 따라서 콜백은 자체 콜백 함수 내에서 자체 등록을 취소할 수 없습니다.

콜백은 StopCallback 메서드를 호출하여 중지할 수도 있습니다. 이렇게 해도 콜백이 등록 취소되지는 않지만 콜백이 다시 호출되지 않도록 합니다. 콜백이 등록 취소되지 않았기 때문에 이 방법은 콜백 자신의 콜백 함수 내에서 호출하는 것이 안전합니다. 현재 콜백 실행은 완료하지만 다시 호출하지는 않습니다. 콜백은 항상 64개만 허용되기 때문에 결국 콜백을 등록 취소해야 합니다.

참고 항목

GameInput 기본 사항

고급 GameInput 항목

입력 API 참조