Моя программа должна запускать событие каждые 180 секунд.
mFoodSpawnTime += dt;
if (mFoodSpawnTime > mFoodSpawnCycleLength)
{
..... etc;
}
mFoodSpawnCycleLength = 180.0f, а mFoodSpawnTime — еще одно число с плавающей запятой, время которого накапливается в каждом цикле.
Моя проблема в том, что если mFoodSpawnCycleLength составляет около 180.0f, то в релизной сборке он никогда не прибудет, и mFoodSpawnTime потребуется до 10 минут, чтобы быть > чем mFoodSpawnCycleLength! Я засек время сборки отладки, и она выполняет цикл через 180 секунд, и я проверил это с помощью секундомера. Вернёмся к релизной сборке: пока mFoodSpawnCycleLength не приближается к 180.0f, он также соответствует показаниям секундомера и выполняет код. Однажды я установил его на 120,0f, и когда он выполнился, секундомер показал 2 минуты 30 секунд. Не существует кода #ifdef DEBUG, который мог бы быть причиной этого.
Итак, я говорю следующее: чем ближе к 180,0f становится mFoodSpawnCycleLength, тем менее точным становится время, но только в релизной сборке!
Я только что распечатал mFoodSpawnTime, и когда мои часы показывали 3 минуты, их время составляло всего около 160 секунд, и я обнаружил, что по мере приближения таймера к 150 секундам приращение времени просто замедляется до остановки. Я отслеживал dt в каждом цикле, и он, кажется, ничем не отличается от того, что было в начале.
Может ли все это быть вызвано навязчивой оптимизацией компилятора?
32-битная ошибка с плавающей запятой?
Я продолжу разбираться с этим, но буду благодарен за любую помощь.
Я все еще учусь этому Я использую книгу DirectX.
Я используйте тайм-код из демо-версии, предоставленной книгой:
int D3DApp::run()
{
MSG msg;
msg.message = WM_NULL;
__int64 cntsPerSec = 0;
QueryPerformanceFrequency((LARGE_INTEGER*)&cntsPerSec);
float secsPerCnt = 1.0f / (float)cntsPerSec;
__int64 prevTimeStamp = 0;
QueryPerformanceCounter((LARGE_INTEGER*)&prevTimeStamp);
while(msg.message != WM_QUIT)
{
// If there are Window messages then process them.
if(PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
// Otherwise, do animation/game stuff.
else
{
if( mTimeReset )
{
QueryPerformanceCounter((LARGE_INTEGER*)&prevTimeStamp);
mTimeReset = false;
}
if( !isDeviceLost() )
{
static float frameLimit = 0.0f;
__int64 currTimeStamp = 0;
QueryPerformanceCounter((LARGE_INTEGER*)&currTimeStamp);
float dt = (currTimeStamp - prevTimeStamp)*secsPerCnt;
if (dt > 2.0f) dt = 0.0f;
frameLimit +=dt;
updateScene(dt);
if (frameLimit > 0.0167f)
{
drawScene();
frameLimit = 0.0f;
}
// Prepare for next iteration: The current time stamp
// the previous time stamp for the next iteration.
prevTimeStamp = currTimeStamp;
}
}
}
return (int)msg.wParam;
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... bug-builds
Разница во времени между выпускаемой и отладочной сборками ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение