Я пишу игровой движок, и мне нужен способ получить точное и точное значение «deltatime», из которого можно получить текущий FPS для отладки, а также ограничить частоту кадров (это важно для нашего проекта).Что хорошего в маске слияния нитей для текущей темы?
Выполнение небольшого исследования, я узнал, что один из лучших способов сделать это - использовать функцию QueryPerformanceCounter
WinAPI. GetTicksCount
должен использоваться для предотвращения forward counter leaps, но это само по себе не очень точно.
Теперь проблема с QueryPerformanceCounter
заключается в том, что она, по-видимому, может возвращать значения, которые выглядели бы, если бы время искажалось (т. Е. Вызов может возвращать значение ранее по времени относительно другого вызова в прошлом). Это происходит только тогда, когда значение, полученное с помощью данного ядра процессора сравнивается со значением, полученным с другим ядром процессора, что приводит меня к основным вопросам, которые побудили меня сделать этот пост:
- мая OS «перераспределить» нить в другое ядро, пока поток уже запущен, или поток выделяется для данного ядра, и это до тех пор, пока нить не умрет?
- Если нить не может быть перераспределена (и это, по крайней мере, имеет для меня большой смысл), то почему это возможно для меня сделать что-то вроде
SetThreadAffinityMask(GetCurrentThread(),mask)
? Ogre3D делает это в своем Ogre::Timer class (Windows implementation), и я предполагаю, что во избежание повторного возвращения. Но для того, чтобы это было правдой, мне пришлось бы рассмотреть возможность того, что потоки будут перемещаться из одного ядра в другое произвольно ОС, что кажется мне довольно странным (не совсем понятно).
Я думаю, это было все, что я хотел знать. Благодарю.
Полезно знать. Я действительно задавался вопросом, сколько методов было для таких измерений. Действительно ли существуют только те 3 известных портативных метода? –
Насколько я знаю, только те 3. Есть тактика часов в реальном времени, но трудно выйти из режима ядра. и это всего лишь 1,1 Mhz тик. –
Что касается выполнения временных тестов на конкретном компьютере, как я уже сказал, это ** не ** для теста производительности. Это важная и неотъемлемая часть конечного продукта. Но спасибо за комментарий. –