Я работаю над C ++ игрой / симуляцией / графическим приложением для Windows.
(редактировать начало) Если это имеет значение, я использую Visual Studio 2013. (редактировать конец)
Настроить: Я измеряю время от одного кадра к следующему, используя QueryPerformanceCounter ().
Действия по воспроизведению:
Остановитесь на точке останова для некоторой отладки.
Текущий нежелательный результат: Когда приложение возобновит выполнение, при следующем вызове QueryPerformanceCounter () оно вернет значение времени, которое включает все время, проведенное в режиме отладки в отладчике. Это приводит к аномально большой длительности кадра.
Желаемый результат: QueryPerformanceCounter () вернет значение времени, которое не включает столько времени, сколько я потратил на паузу в точке останова для отладки.
Как мне достичь желаемого результата?
1. Есть ли другая функция, которую я должен использовать вместо QueryPerformanceCounter?
2. Есть ли какие-то настройки в IDE (т.е. Visual Studio), которые можно изменить?
3. Есть ли какой-то особый способ использовать QueryPerformanceCounter или другой
функция времени?
4. и т. Д.
Справочные заметки: Здесь есть несколько схожий вопрос, но мне не помогло найти решение. Время отслеживания в отладчике
Я не уверен, что понимаю, что вы пытаетесь сделать.
Если вы все еще хотите измерить время в режиме отладки, вот вам идея:
#include <iostream>
#include <chrono>
#include <Windows.h>
struct duration
{
std::chrono::high_resolution_clock::time_point _s;
duration() : _s( std::chrono::high_resolution_clock::now() )
{
// nop
}
auto ms()
{
return std::chrono::duration<double, std::milli>( std::chrono::high_resolution_clock::now() - _s ).count();
}
};
struct breakpoint
{
std::chrono::high_resolution_clock::time_point _s;
duration& _d;
breakpoint( duration& a_d ) : _s( std::chrono::high_resolution_clock::now() ), _d( a_d )
{
__asm {int 3}
}
~breakpoint()
{
_d._s += std::chrono::high_resolution_clock::now() - _s;
}
};
int main()
{
duration d;
Sleep( 1000 );
std::cout << d.ms() << std::endl;
breakpoint { d };
Sleep( 1000 );
std::cout << d.ms() << std::endl;
return 0;
}
Используйте коммерческий инструмент профилирования. Измерение того, сколько времени потребовалось для выполнения функции или метода, — это именно то, для чего они созданы.
Кроме того, почему вас волнует, сколько времени что-то заняло во время отладки? Планируете ли вы выпускать для своих клиентов в режиме отладки и обходить их построчно, пока они играют? Если вы хотите проверить время кадра, проверьте его в выпуске с включенной оптимизацией.