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]