Как правильно заняться ожиданием в Windows? - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно реализовать ожидание занятости.

Если вы считаете, что я не должен этого делать, пожалуйста, предоставьте альтернативу с низкой задержкой ожиданию занятости для ID3D11DeviceContext :: GetData для возврата S_OK, чтоработает на Windows 7 SP1.

Я нашел KeStallExecutionProcessor API, который делает именно то, что мне нужно. Этот API доступен в пользовательском режиме? Если нет, то как это реализовано? Я знаю, как назвать _mm_pause внутренним, но я не знаю, как измерить время с достаточной точностью: QueryPerformanceCounter слишком дорого для занятого ожидания, GetTickCount дешево, но не имеет нужного мне разрешения,и _rdtsc может масштабироваться с частотой процессора.

Обновление № 1: Я могу просто остановить процессор, например for ( int i = 0; i < 1000; i++ ) _mm_pause(); Это то, что я делаю сейчас некоторое время, до тоговместо этого он начинает вызывать Sleep( 1 ) во внешнем цикле.

Обновление № 2: Правильное ожидание графического процессора было реализовано только в Windows 10 1703 «Обновление создателей», см. ID3D11Device5:: CreateFence и ID3D11Fence :: SetEventOnCompletion API. В Windows 7, 8, 8.1 и 10 до 1703 года ожидание занятости - единственный способ получать уведомления. И я должен быть уведомлен как можно скорее, каждая миллисекунда имеет значение. У меня есть только 16 мсек для рендеринга кадра во времени, у некоторых пользователей дисплеи 144 Гц, что составляет всего 7 мс на их ПК.

...