当使用手柄操作游戏时,Windows平台部分接口调用耗时突然增加

Windows 10 专业版 22H2 19045.6093

在系统安装了 GameInputV1组件后(GameInputRedist.msi)

使用控制器会偶现降帧问题

【1_GetCursorPos19MS.uestats】在复现的时候,我们查到 ::GetCursorPos 这个接口的调用非常之高。随后我们增加了一些跳过的代码来验证是不是这个接口的问题:

`FVector2D FWindowsCursor::GetPosition() const
{
if (SkipGetCursorPos)
{
return TempLastCursorPos;
}

POINT CursorPos;

{
QUICK_SCOPE_CYCLE_COUNTER(STAT_FEngineLoop_SlateApp_GetCursorPos);
::GetCursorPos(&CursorPos);
}`[Image Removed]

【2_XInputGetState27MS.uestats】 是最新录制的分析文件,我们在复现的时候屏蔽了GetCursorPos的调用,但是发现XInputGetState的耗时巨高。

[Image Removed]

`{
QUICK_SCOPE_CYCLE_COUNTER(STAT_XInputInterface_SendControllerEvents_StateLoop);

for ( int32 ControllerIndex=0; ControllerIndex < MAX_NUM_XINPUT_CONTROLLERS; ++ControllerIndex )
{
FControllerState& ControllerState = ControllerStates[ControllerIndex];

bWereConnected[ControllerIndex] = ControllerState.bIsConnected;

if (ControllerState.bIsConnected || bNeedsControllerStateUpdate || ForceControllerStateUpdate != 0)
{
XINPUT_STATE& XInputState = XInputStates[ControllerIndex];

{
QUICK_SCOPE_CYCLE_COUNTER(STAT_XInputInterface_SendControllerEvents_XInputStateZero);
FMemory::Memzero( &XInputState, sizeof(XINPUT_STATE) );
}

{
QUICK_SCOPE_CYCLE_COUNTER(STAT_XInputInterface_SendControllerEvents_XInputGetState);
ControllerState.bIsConnected = (XInputGetState(ControllerIndex, &XInputState) == ERROR_SUCCESS) ? true : false;
}

if (ControllerState.bIsConnected)
{
bIsGamepadAttached = true;
}
}
}
}`

在正常情况下,操作手柄的时候这些接口几乎没有变化

[Image Removed]

HI,

这个问题 是个别机器上有的 还是只要是同一操作系统下 都会发生的?我感觉这个和驱动有关系。查了下这个service确实会通过提高CPU usage来提高输入响应速度 如果驱动不匹配可能会有卡顿的。