LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Если время с предыдущего кадра < 1/250, то не рисовать.

uint64_t prev_frame_time = 0;
for (;;) {
  if (time_ns() - prev_frame_time > secf_to_ns(1.0f / 250.0f)) {
    prev_frame_time = time_ns();
    draw();
  }
}

Пока что я придумал только вычесть из задержки время тратящееся на слип в линуксе.

А если задержка в несколько раз больше чем тебе надо?

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Если время с предыдущего кадра < 1/250, то не рисовать.

uint64_t t1 = 0;

for (;;) {
  if (time_ns() - t1 > secf_to_ns(1.0f / 250.0f)) {
    t1 = time_ns();
    draw();
  }
}

Пока что я придумал только вычесть из задержки время тратящееся на слип в линуксе.

А если задержка в несколько раз больше чем тебе надо?

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Если время с предыдущего кадра < 1/250, то не рисовать.

uint64_t t1 = 0;
uint64_t fps_limit = 250;

for (;;) {
  if (time_ns() - t1 > secf_to_ns(1.0 / fps_limit)) {
    t1 = time_ns();
    draw();
  }
}

Пока что я придумал только вычесть из задержки время тратящееся на слип в линуксе.

А если задержка в несколько раз больше чем тебе надо?

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Если время с предыдущего кадра < 1/250, то не рисовать.

uint64_t t1 = 0;
uint64_t fps_limit = 250;

for (;;) {
  if (time_ns() - t1 > secf_to_ns(1.0 / fps_limit)) {
    t1 = time_ns();
    draw();
  }
}

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Если время с предыдущего кадра < 1/250, то не рисовать.

uint64_t t1 = 0;
uint64_t fps_limit = 250;

for (;;) {
  if (time_ns() - t1 > secf_to_ns(1.0 / fps_limit)) {
    t1 = time_ns();
    draw();
  }
}

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Если время с предыдущего кадра < 1/250, то не рисовать.

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Так как в разную секунду разные фпс, то нужно просто измерять время между кадрами, и смотреть сколько еще подобных кадров ты сможешь сделать за секунду. На основе этого вычислять сколько кадров нужно пропустить.

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Так как в разную секунду разные фпс, то нужно просто измерять время между кадрами, и смотреть сколько еще подобных кадров ты сможешь сделать за секунду.

Исправление MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Допустим частота монитора 60, без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?

Исходная версия MOPKOBKA, :

Если ты уже умеешь пропускать кадры, что же мешает пропускать их для лимита фпс?

С vsync ты уже решил, как я понял. Без vsync у тебя 500 фпс, тебе нужен лимит условно 250. Точно так же пропускай каждый второй?