GameInput 기본 사항
대부분의 레거시 Microsoft 입력 API는 장치 중심입니다. 즉, 응용 프로그램 코드는 일반적으로 일종의 열거 패턴을 통해 지원하는 입력 장치를 먼저 찾아야 입력을 읽을 수 있습니다. 상대적으로 간단한 입력 요건을 가진 대부분의 게임의 경우, 이렇게 하면 많은 코드가 추가되고 복잡해집니다.
반면 GameInput API는 입력 중심 API입니다. 애플리케이션은 먼저 관심 있는 입력을 찾은 다음 선택적으로 입력한 장치에 대해 쿼리할 수 있습니다. 이는 더 자연스러운 알고리즘으로 이어지고, 다시 더 간단한 코드로 이어집니다.
입력 스트림 아키텍처
GameInput은 입력 스트림의 개념을 중심으로 구축되었습니다. 시스템에 연결된 모든 장치의 입력은 발생한 순서대로 하나의 연속 입력 이벤트 스트림으로 전달됩니다. 여러 장치가 동시에 입력하면 입력 이벤트가 자연스럽게 인터리빙됩니다. 다음은 여러 입력 장치로부터 발생하는 입력 스트림의 예입니다.
이 예제에서는 4개의 장치에서 입력을 동시에 보냅니다. 각 사각형의 번호는 입력이 보내지는 순서를 나타내고 색상은 입력을 보낸 장치를 나타냅니다. 이 예에서는 첫 번째 게임패드에서 첫 번째 입력을 보내며, 키보드가 두 번째 입력을 전송하면 마우스가 세 번째 입력을 보내며, 두 번째 게임패드는 네 번째 입력을 보냅니다.
입력 스트림의 각 요소는 "읽기"로 표시됩니다. 애플리케이션은 입력 스트림에서 가장 최신 읽기를 가져오는 것으로 시작합니다. 여기에서 애플리케이션은 주기적으로 가장 최근 입력을 계속 읽거나 입력 스트림의 앞/뒤로 이동하여 인접한 입력을 살필 수 있습니다. 두 경우 모두 애플리케이션은 일반적으로 관심 항목 읽기 간의 차이를 비교한 다음 적절한 조치를 취합니다.
예를 들어, 1인칭 슈팅 게임은 플레이어의 무기를 발사해야 하는지 결정하기 위해 각 프레임의 시작 부분에서 버튼이 눌렸는지만 확인하면 될 것입니다. 이 경우 가장 최근의 입력 읽기만 중요합니다. 사이의 입력 읽기는 무시할 수 있습니다. 반면에 경쟁하는 파이팅 게임은 다음과 같은 이유로 지난 프레임과 현재 프레임 사이에서 발생한 모든 입력 상태의 변화를 조사하려고 할 것입니다.
- 버튼을 두 번 누르면 한 번 누르는 것과 다른 콤보/동작으로 이어질 수 있습니다.
- 두 개의 버튼을 누르는 순서가 중요할 수 있습니다.
- 두 버튼을 누른 사이의 경과 시간이 중요할 수 있습니다.
입력 스트림에서 읽기를 검색할 때 애플리케이션은 특정 입력 유형(예: 게임 패드 또는 키보드) 및/또는 특정 장치에서만 읽는 것으로 결과를 제한하는 선택적 필터를 적용할 수 있습니다. 자세한 내용은 GameInput 읽기를 참조하세요.
애플리케이션은 마지막 0.5초 이내에 발생한 입력 스트림에서만 과거 읽기를 요청할 수 있습니다. 연결된 각 장치의 가장 최근 입력은 오래되었더라도 항상 액세스할 수 있습니다.
인터페이스
GameInput API는 다음 다이어그램과 같이 그래픽 및 오디오 API와 유사하게 관련 인터페이스의 컬렉션을 통해 사용됩니다.
GameInput API 표면의 대부분을 구성하는 세 가지 기본 인터페이스가 있습니다.
IGameInput
은GameInputCreate
factory 함수를 호출하여 가져올 수 있는 기본 인터페이스입니다. 입력 스트림에서 읽기를 검색하고 콜백을 등록하며 다른 글로벌 기능에 액세스하는 방법이 포함되어 있습니다.IGameInputReading
은 입력 스트림의 단일 요소를 나타냅니다. 여기에는 읽기에 저장된 입력 상태 데이터를 검색하고 입력한 장치에 액세스하는 방법이 포함되어 있습니다. 읽기는 또한 스트림의 다른 읽기를 통해 앞/뒤로 이동할 때 입력 스트림 내의 참조 지점으로도 사용됩니다.IGameInputDevice
는 시스템에 연결 하나의 입력 장치를 나타냅니다. 장치의 속성과 현재 상태를 검색하는 방법, 장치에서 촉각과 힘 피드백을 제어하는 방법 등이 포함되어 있습니다. 또한 하위 수준 원시 장치 I/O를 수행하는 방법도 포함됩니다.
나머지 인터페이스는 고급 GameInput 항목 섹션에 설명되어 있는 특정 상황에 사용됩니다.
참고 항목
그래픽 및 오디오 API와 마찬가지로 GameInput은 IUnknown에서 파생된 인터페이스를 제공하지만 진정한 COM API는 아닙니다. 이 API 스타일을 "COM 라이트" 또는 "nano-COM"이라고도 합니다. IUnknown은 참조 계산 및 리플렉션에 사용되지만 COM 런타임 인프라는 GameInput에서 사용되지 않습니다. 특히, 이는 다음을 의미합니다.
- 애플리케이션은 개체 인스턴스를 얻기 위해
CoInitialize
또는CoCreateInstance
을(를) 호출하지 않습니다. - 집계 및 호출자 제공 인터페이스 구현과 같은 COM 기능이 지원되지 않습니다.
- 교차 프로세스 마샬링 지원도 없고 아파트/스레딩 모델도 없습니다. 모든 개체가 Agile입니다.
- 인터페이스 포인터는 IUnknown을 통과하지 않고 개체 ID를 대상으로 직접 비교할 수 있습니다.
- 메서드가
HRESULT
코드를 반환할 필요가 없어 흔히 함수 서명이 간단해집니다.
애플리케이션 초점
콘솔에서 GameInput은 초점에 있을 때만 애플리케이션에 입력을 제공합니다. 그렇지 않으면 반환되는 상태에는 사용자가 장치를 만지지 않을 때처럼 중립 또는 '휴면' 값이 포함됩니다. 이렇게 하면 포커스 변경을 처리하는 추가 입력 코드가 필요하지 않습니다.
PC에서 입력은 기본적으로 모든 프로세스에 제공됩니다. 나중에 SetFocusPolicy 메서드를 사용하여 이 동작을 변경할 수 있습니다.
애플리케이션이 초점을 잃을 때 장치에 전송되는 촉각이나 힘 피드백도 비활성화됩니다. 새로운 피드백 상태를 설정하기 위해 여전히 GameInput API를 호출할 수 있지만 새로운 상태는 장치에 전송되지 않습니다. 애플리케이션에 다시 포커스가 돌아오면 애플리케이션이 요청한 가장 최근의 피드백 상태가 자동으로 장치로 전송됩니다.
따라서 애플리케이션에서는 사용자가 포커스를 얻거나 잃을 때 입력 또는 촉각/힘 피드백과 관련된 특별한 작업을 수행할 필요가 없습니다. GameInput API는 항상 애플리케이션 대신 준비를 합니다.
참고 항목
GameInput API는 애플리케이션이 백그라운드에 있을 때도 특정 종류의 하위 수준 장치 I/O에 대한 독점 액세스를 일시적으로 얻을 수 있습니다. 자세한 내용은 AcquireExclusiveRawDeviceAccess
메서드를 참조하세요. 하지만 이는 출력에만 적용됩니다. 입력은 애플리케이션에 초점이 없으면 액세스할 수 없습니다.