Мне нужно реализовать ожидание занятости.
Если вы считаете, что я не должен этого делать, пожалуйста, предоставьте альтернативу с низкой задержкой ожиданию занятости для 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 мс на их ПК.