ПрограммированиеФорумГрафика

C++ Как сделать плавную графику? (3 стр)

Страницы: 1 2 3
#30
13:45, 19 авг 2023

У меня уже был статеринг при рендере, я каждую секунду получал микрофриз при использовании vsync из glfw, может это проблема драйверов ATI Radeon или винды, на линуксе у меня такого не было. Я просто воткнул glFlush в конец рендера кадра и всё пофиксилось.
Сейчас же у меня статеринг на уровне логики игры, я юзаю всё тот же dt что и раньше, но если фреймрейт стабильный и не дёрганный, то апдейт не равномерный и движения дёрганные, межкадровая интерполяция движения не помогает

#31
13:53, 19 авг 2023

Skvoznjak
> Естественно, в начале игры должен быть самый совместимый с дровами режим
Уже сделал так, игра стартует с vsync под частоту монитора, но можно выключить, автоматом ставится частота в два раза больше, но лимит фпс можно менять. Так же я могу в дебаге менять тикрейт игры, но нет значений при котором у меня не будет дёрганного движения, даже при кратном фпс тикрейте.
Дёрганное движение видно с vsync и в окне и в фуллскрине. Я не видел этого когда игра была с фиксированным апдейтом под 60 фпс, все движения были плавными в любой момент. Думаю, надо жёстко фиксировать сколько раз будет апдейт за кадр чтобы колебания dt не влияли на тикрейт

#32
14:23, 19 авг 2023

HPW-Dev
>Думаю, надо жёстко фиксировать сколько раз будет апдейт за кадр чтобы колебания dt не влияли на тикрейт

Иногда всё равно будет затормаживать, когда железо не успеет просчитать, проблему статоров давно обсуждают и полностью решить не могут. Ты можешь выбрать, прыгнет движущийся объект после торможения системы или тоже затормозит. Это всё из-за ЖК, которые плохо сглаживают картинку и делают заметным то, что делать не надо.

#33
23:13, 19 авг 2023

вот так сделал:

  if (graphic.vsync) {
    if (frame_drawn)
      update_time_accum += vsync_frame_time;
  } else {
    update_time_accum += dt;
  }

теперь на экране всё плавно

#34
2:13, 20 авг 2023

А если в другом потоке чем-то тяжёлым и неравномерным нагрузить?

#35
3:29, 20 авг 2023

Skvoznjak
> А если в другом потоке чем-то тяжёлым и неравномерным нагрузить?
Мне надо чтобы игра при лагах просто фризила, но не дёргалась с резкими движениями. Может просто взять медиану по нескольким dt и использовать её для апдейта? Тогда редкие скачки просто отфильтруются

#36
3:47, 20 авг 2023

Если просто тормозить, то изменение времени тебе конечно поможет.

#37
21:10, 20 авг 2023

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

Видос как выглядит (снято дёрганно всё равно, но на реальном экране плавнее)
[file=171614]

#38
0:44, 21 авг 2023

А движение происходит всегда на целое количество пикселей?

#39
2:27, 21 авг 2023

122
> В те годы на подёргивания анимации\физики внимание не обращали, 25фпс есть и
> ок. Сегодня игрок стал гораздо внимательнее к такому.
В Сурсе никаких подёргиваний нет, там рендер интерполирует между стейтами. Ты через ССЗБ-консоль можешь вообще -tickrate 11 выставить, но при этом визуально игра будет такая же плавная, никаких слайдшоу возникать не будет.

А вот чем реально такая интерполяция может не понравиться — это что появляется инпут лаг размером в период тика. Так как рендеру для интерполяции нужно как минимум два стейта, между которыми интерполировать — то ситуация на экране будет постоянно на 1 / tickrate позади "актуального" состояния мира. Если tickrate выставить по-нормальному, впрочем, то это не будет вызывать проблем. Ты вот, например, даже не знал о существовании этого инпут лага (иначе обязательно бы упомянул).

#40
2:47, 21 авг 2023

Skvoznjak
> А движение происходит всегда на целое количество пикселей?

Смещение объекта в апдейте:

vel = 60
pos += vel * fixed_update_dt

При рендере интерполяция

alpha = (время от начала апдейта до начала рендера) / fixed_update_time
draw_pos = lerp(pos, pos_future, alpha)
#41
15:37, 21 авг 2023

Имбирная Ведьмочка
> вот чем реально такая интерполяция может не понравиться — это что появляется
> инпут лаг размером в период тика.

Инпут лаг заметен только для движения камеры/курсора - их можно обновлять на каждом кадре, без интерполяции, имея всегда последнее актуальное состояние.

Страницы: 1 2 3
ПрограммированиеФорумГрафика

Тема в архиве.

Тема закрыта.