Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Игровой цикл, delta time, подёргивания и рывки (Решено)

Игровой цикл, delta time, подёргивания и рывки (Решено)

Поделиться

Страницы: 1 2 3 Следующая

МужикПостоялецwww14 окт. 201716:14#0
Делал цикл по вот этой статье: https://www.koonsolo.com/news/dewitters-gameloop/
После реализации в движении объектов были какие-то небольшие рывки.
Думал неправильно интерполирую, но проблема оказалась в функции GetTickCount() - которую предлагают использовать в половине статей по реализации игрового цикла.
Видимо недостаточная точность или что-то вроде этого.
Заменил её на аналогичную функцию из chrono, все рывки пропали и всё стало плавно.

Может кому поможет, а то в комментах в статьях никто про это не пишет. Хотя может проблема и не у всех возникает, а может не обращают внимания.

eugenelozaПостоялецwww14 окт. 201718:15#1
Мужик
> The resolution of the GetTickCount64 function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds.
т.е. в районе 60 FPS в худшем случае (недавно сам нарвался :)), т.е. если пытаться основываться на GetTickCount64, то можно получить рывки 30-60 FPS (в два раза смена частоты кадров, а в худшем случае - и того больше).
ShadowTeologПостоялецwww14 окт. 201720:24#2
timeBeginPeriod(minperiod из TIMEDEVCAPS) 
timeGetTime()
Получаеться точность в районе миллисекунды.  Меньше смысла нет, все равно сетевая расхлябанность даже в локалке больше, и подергивания будут уже от неравномерности времени получения пакетов с сервера. Борьба с этим отдельная боль.
Ну и даже локально - неравномерный фпс и кратковременные лаги помогут обрести мудрость и просветление через страдание :)

Правка: 14 окт. 2017 20:24

romgermanПостоялецwww14 окт. 201721:30#3
В хроно вроде queryPerformanceTimer используется
Iron ManПостоялецwww16 окт. 20170:27#4
Потомкам на будущее, чтоб не извращались:

timer.h:

class Timer
{
public:
  Timer();
  ~Timer() {};

  void      TimerUpdate();

  int        fps, seconds, minutes, hours;
  double      frameLength;

private:
  __int64      frequency, timer_start, time;
  double      resolution, lastTime;
};
timer.cpp:
Timer::Timer()
{
  QueryPerformanceFrequency((LARGE_INTEGER*)&frequency);
  QueryPerformanceCounter((LARGE_INTEGER*)&timer_start);

  resolution = (double)(((double)1.0f) / ((double)frequency));
  lastTime = (double)timer_start;
}

void Timer::TimerUpdate()
{
  QueryPerformanceCounter((LARGE_INTEGER*)&time);
  double now = ((double)(time - timer_start) * resolution) * 1000.0f;

  frameLength = now - lastTime;
  if (frameLength <= 0.0f) frameLength = 1.0f;

  fps = (int)(1000.0f / frameLength);
  lastTime = now;
  seconds = (int)(now / 1000);
  hours = seconds / 3600;
  minutes = seconds / 60 - hours * 3600;
  seconds = seconds - hours * 3600 - minutes * 60;
}

Правка: 16 окт. 2017 0:29

boolПостоялецwww16 окт. 201714:04#5
Iron Man
очень много лишних скобочек
> resolution = (double)(((double)1.0f) / ((double)frequency));
resolution = 1.0 / (double)frequency;
Ghost2Постоялецwww16 окт. 201715:41#6
bool

У тебя тоже много. А вообще этот класс лучше потомкам не показывать, примерно как работы Дали.
Не поймут ведь никогда, что он делал и зачем нужен.

boolПостоялецwww16 окт. 201722:43#7
Ghost2
А как ещё меньше сделать?
0iStalkerМодераторwww16 окт. 201723:02#8
ShadowTeolog
> timeBeginPeriod(minperiod из TIMEDEVCAPS) 
> timeGetTime()
> Получаеться точность в районе миллисекунды. 

Почему не стоит так делать, - https://habrahabr.ru/company/intel/blog/186998/

PS.
На Win8 и выше появилась https://msdn.microsoft.com/ru-ru/library/windows/desktop/hh706895(v=vs.85).aspx  (аналог gettimeofday из *nix), в более ранних предпочтительно использовать QPF/QPC

nesПостоялецwww16 окт. 201723:39#9
0iStalker
>Почему не стоит так делать, - https://habrahabr.ru/company/intel/blog/186998/
Неубедительно, в старых добрых idTech юзали и не парились.
andreyuПостоялецwww17 окт. 20175:26#10
bool
resolution = 1.0 / frequency;
MrShoorУчастникwww17 окт. 20178:21#11
nes
> Неубедительно, в старых добрых idTech юзали и не парились.
В старых добрых idTech и гамму выкручивали вусмерть при запуске. Так что это не показатель.
nesПостоялецwww17 окт. 20178:41#12
MrShoor
Зато там не лагало игровое время, как от этих ваших кривых performance counter-ов.
Ghost2Постоялецwww17 окт. 201710:52#13
nes

Лагает время не от каунтеров, а от кривых рук.

nesПостоялецwww17 окт. 201711:05#14
Ghost2
>Лагает время не от каунтеров, а от кривых рук.
Ну тогда тоже самое можно сказать и про timeGetTime.

Страницы: 1 2 3 Следующая

/ Форум / Программирование игр / Общее

2001—2017 © GameDev.ru — Разработка игр