Моя программа должна запускать событие каждые 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++
Программы на C++. Форум разработчиков
-
Anonymous
1733516984
Anonymous
Моя программа должна запускать событие каждые 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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/7893380/time-differences-between-release-and-debug-builds[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия