GameInput 读取
GameInput 读取
从每个设备接收的原始输入数据包封装在“读取”对象中。读取包含原始数据包,以及(通常)对原始数据的一种或多种更高层格式的转换。除了作为数据容器的作用之外,读取还充当引用输入流中特定位置的标识符。
调用 GetCurrentReading 检索输入流中的最新读取。可以传入一个可选的 GameInputKind 筛选器,将返回的读取限制为特定输入种类,例如游戏手柄或键盘。还可以传入一个可选的 IGameInputDevice 筛选器,将返回的读取限制为仅由指定设备产生的读取。这些筛选器可以单独使用,也可以组合使用。
IGameInputReading 实例是按引用计数的单例。检索读取是极快且轻量的操作——不会进行内存分配或复制,API 调用是无锁的,也不会切换到内核态。由于读取是单例,应用程序可比较读取指针的相等性,以判断两次对 GetCurrentReading 的调用是否返回了同一个读取(意味着没有产生新的输入)。
输入需求较简单的游戏可以每帧仅轮询一次新输入,并比较两个读取中存储的状态差异(若不是同一个读取)。而输入需求较复杂的游戏则可能需要遍历输入流,以获取自上一帧以来发生的所有输入状态变化的完整情况。可通过 GetNextReading 和 GetPreviousReading 方法实现,二者所允许的筛选器与 GetCurrentReading 相同。输入流在其缓冲区中保留过去半秒的历史读取。
或者,应用程序可以注册一个回调,在产生输入时调用。与前述同步方法类似,可以应用若干筛选器来控制返回的读取类型和来源设备。有关详细信息,请参阅“GameInput 高级主题”一节中的 GameInput 回调。
读取中可用的数据种类取决于输入设备及其物理属性。例如,来自标准键盘的读取可能只包含键盘数据,而带有集成轨迹球的键盘所产生的读取可能同时包含键盘和鼠标数据。
几乎所有游戏控制器都会产生包含通用“控制器”数据的读取,即匿名的轴和按键状态集合。这为具有输入映射 UI 的应用程序提供了广泛的设备支持。然而,许多游戏控制器(例如游戏手柄)在其读取中还公开熟悉的固定格式状态,对典型游戏而言更易于使用。
IGameInputReading 接口包含以读取所支持的任意格式检索状态的方法。读取中可用的所有不同表示均为预计算,因此这些方法只需复制少量字节的数据即可返回。
最后修改于 2026年8月13日
