Ryo-kun0101 Ответов: 2

для чего нужна QueryPerformanceFrequency?


Привет,
Я читаю код системы синхронизации Cyclone (образец, который Ян Миллингтон сделал, чтобы продемонстрировать физический движок). И там я достигаю 1 функции, которую никогда раньше не видел, QueryPerformanceFrequency.
Здесь функция, которая использовала QueryPerformanceFrequency:

void initTime()
{
    LONGLONG time;

    qpcFlag = (QueryPerformanceFrequency((LARGE_INTEGER*)&time) > 0);

    // Check if we have access to the performance counter at this
    // resolution.
    if (qpcFlag) qpcFrequency = 1000.0 / time;
}


Я просто не понимаю этой строки
if (qpcFlag) qpcFrequency = 1000.0 / time;

Я просто могу догадаться, что WinAPI получает частоту процессора и сохраняет ее в var-времени. Но, как мы видим, gpcFrequency-это действительно частота. Так что же именно делает WinAPI?

Еще один дополнительный вопрос, мне все еще трудно понять код Cyclone, особенно временные данные в файле timing.cpp я могу понять физический код, такой как скорость и положение, но временные данные-такая странная теория для меня. Может ли кто-нибудь порекомендовать какое-либо объяснение о времени в игровом движке, книге или статье-это нормально. Спасибо.

Santhosh G_

Есть ли в вашем коде какие-либо вызовы QueryPerformanceCounter ?

Sergey Chepurin

Как вы спросили "время игры и многоядерные процессоры" -http://msdn.microsoft.com/en-us/library/ee417693%28VS.85%29.aspx

2 Ответов

Рейтинг:
17

Santhosh G_

Обычно QueryPerformanceCounter и QueryPerformanceFrequency используются для получения точного времени выполнения операции.

QueryPerformanceCounter() предоставляет текущее значение таймера высокого разрешения.
и
QueryPerformanceFrequency возвращает текущую частоту счетчика производительности в количестве отсчетов в секунду.
Обе эти функции предоставляют информацию о счетчиках производительности с высоким разрешением в системе.

qpcFlag = (QueryPerformanceFrequency((LARGE_INTEGER*)&time) > 0);
if (qpcFlag) qpcFrequency = 1000.0 / time;


Здесь qpcFlag указывает на наличие таймера высокого разрешения в вашей машине. time это количество отсчетов в секунду таймера высокого разрешения. Следовательно qpcFrequency это частота в миллисекундах.

Пример измерения времени выполнения операции.
QueryPerformanceCounter( &StartTime );
// Some Processing...
..
QueryPerformanceCounter( &EndTime );


После этого вы можете измерить время обработки в миллисекундах с помощью следующего кода.
double fTime = (double)((EndTime.QuadPart - StartTime.QuadPart ) * qpcFrequency );


Детали QPC и QPF
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644905(v=против 85).aspx[^]

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=против 85).aspx[^]


Espen Harlinn

5 ЕД! Это хороший ответ :-D

Rick York

У вас терминология поменялась местами. Так и должно быть : Скрыть   скопировать код

QueryPerformanceFrequency((LARGE_INTEGER*)&freqency) > 0); if (qpcFlag) qpcPeriod = 1000.0 / frequency;
QPF дает частоту, как следует из названия. Обратная величина частоты-это период в миллисекундах, так как он масштабируется на 1000.

Рейтинг:
1

mngerhold

Ответ заключается в том, что код циклона сбивает с толку! Возвращаемое значение QPF действительно является частотой в счетах/сек, поэтому возврат к переменной под названием "Время" бесполезен. Значение qpcFrequency, представленное выражением '1000.0/time', тогда фактически является "интервалом счетчика" в миллисекундах. Функция QPC возвращает счетчик, поэтому время между двумя событиями равно (count2 - count1)*'интервал счетчика' и измеряется в миллисекундах.

Я только потрудился сделать этот комментарий, так как я только что использовал QPF &QPC (в VB6 !, до переноса битов в LabWindows), и наткнулся на этот вопрос, когда пытался узнать больше об этой функции - как давний браузер гостиной на этом форуме, я чувствовал, что пришло время внести свой вклад, даже если немного опоздал!

Кто-нибудь это увидит?


HilmerDek

да, спасибо

Nelek

Да... это уже видно.