Windows 11 Raw Input API плохая производительность по сравнению с Win10, Win 11 не получает полные 1000 ГцC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Windows 11 Raw Input API плохая производительность по сравнению с Win10, Win 11 не получает полные 1000 Гц

Сообщение Anonymous »

как следует из названия...
с моим кодом, который представляет собой обычный пример ввода RAW.... WM_INPUT, RIM_TYPEMOUSE... Я получаю в Windows 10 полную частоту 1000 Гц моей мыши, а в Windows 11 я получаю около 128 Гц.
Как это исправить, чтобы она работала с полными 1000 Гц в Windows 11?
Следует ли мне использовать буферизованное чтение RawInputData?
static LRESULT CALLBACK HiddenWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
if ( msg == WM_INPUT ) {
UINT dwSize = 0;
GetRawInputData( (HRAWINPUT)lParam, RID_INPUT, nullptr, &dwSize, sizeof( RAWINPUTHEADER ) );
BYTE* lpb = new BYTE[dwSize];

if ( GetRawInputData( (HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof( RAWINPUTHEADER ) ) != dwSize ) {
delete[] lpb;
return DefWindowProc( hwnd, msg, wParam, lParam );
}

RAWINPUT* raw = (RAWINPUT*)lpb;
if ( raw->header.dwType == RIM_TYPEMOUSE ) {
_MouseData md = mousedata.load();

md.dx += raw->data.mouse.lLastX;
md.dy += raw->data.mouse.lLastY;
md.dw += (*(short*)&raw->data.mouse.usButtonData) / WHEEL_DELTA;
md.tick += 1;

mousedata.store( md );

// printf( "X: %i, Y: %i, W: %i\n", raw->data.mouse.lLastX, raw->data.mouse.lLastY, (*(short*)&raw->data.mouse.usButtonData) / WHEEL_DELTA );
}

delete[] lpb;
}

. . .
return DefWindowProc( hwnd, msg, wParam, lParam );
}

static HWND CreateHiddenMessageWindow( HINSTANCE hInst ) {
const wchar_t CLASS_NAME[] = L"HiddenRawInputWindow";

WNDCLASS wc = {};
wc.lpfnWndProc = HiddenWndProc;
wc.hInstance = hInst;
wc.lpszClassName = CLASS_NAME;
RegisterClass( &wc );

// MESSAGE-ONLY window (no visible UI)
HWND hwnd = CreateWindowEx(
0, CLASS_NAME, L"test", 0,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
nullptr, nullptr, hInst, nullptr
);

return hwnd;
}

static int _RegisterRawMouse( HWND hwnd ) {
// Register for all HID input (generic)
RAWINPUTDEVICE rid[1] = {};

rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x02;
rid[0].dwFlags = RIDEV_NOLEGACY | RIDEV_CAPTUREMOUSE | RIDEV_INPUTSINK;
rid[0].hwndTarget = hwnd;

if ( not RegisterRawInputDevices( rid, 1, sizeof( RAWINPUTDEVICE ) ) ) {
return 1;
}
return 0;
}

while ( PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... esnt-get-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»