У меня уже был статеринг при рендере, я каждую секунду получал микрофриз при использовании vsync из glfw, может это проблема драйверов ATI Radeon или винды, на линуксе у меня такого не было. Я просто воткнул glFlush в конец рендера кадра и всё пофиксилось.
Сейчас же у меня статеринг на уровне логики игры, я юзаю всё тот же dt что и раньше, но если фреймрейт стабильный и не дёрганный, то апдейт не равномерный и движения дёрганные, межкадровая интерполяция движения не помогает
Skvoznjak
> Естественно, в начале игры должен быть самый совместимый с дровами режим
Уже сделал так, игра стартует с vsync под частоту монитора, но можно выключить, автоматом ставится частота в два раза больше, но лимит фпс можно менять. Так же я могу в дебаге менять тикрейт игры, но нет значений при котором у меня не будет дёрганного движения, даже при кратном фпс тикрейте.
Дёрганное движение видно с vsync и в окне и в фуллскрине. Я не видел этого когда игра была с фиксированным апдейтом под 60 фпс, все движения были плавными в любой момент. Думаю, надо жёстко фиксировать сколько раз будет апдейт за кадр чтобы колебания dt не влияли на тикрейт
HPW-Dev
>Думаю, надо жёстко фиксировать сколько раз будет апдейт за кадр чтобы колебания dt не влияли на тикрейт
Иногда всё равно будет затормаживать, когда железо не успеет просчитать, проблему статоров давно обсуждают и полностью решить не могут. Ты можешь выбрать, прыгнет движущийся объект после торможения системы или тоже затормозит. Это всё из-за ЖК, которые плохо сглаживают картинку и делают заметным то, что делать не надо.
вот так сделал:
if (graphic.vsync) { if ( frame_drawn) update_time_accum += vsync_frame_time; } else { update_time_accum += dt; }
теперь на экране всё плавно
А если в другом потоке чем-то тяжёлым и неравномерным нагрузить?
Skvoznjak
> А если в другом потоке чем-то тяжёлым и неравномерным нагрузить?
Мне надо чтобы игра при лагах просто фризила, но не дёргалась с резкими движениями. Может просто взять медиану по нескольким dt и использовать её для апдейта? Тогда редкие скачки просто отфильтруются
Если просто тормозить, то изменение времени тебе конечно поможет.
Когда по медиане dt фильтрую, тоже не получается плавного движение. Оставил предыдущий варик
и лимит повесил на большой дт чтоб игра при лагах фризилась.
Видос как выглядит (снято дёрганно всё равно, но на реальном экране плавнее)
[file=171614]
А движение происходит всегда на целое количество пикселей?
122
> В те годы на подёргивания анимации\физики внимание не обращали, 25фпс есть и
> ок. Сегодня игрок стал гораздо внимательнее к такому.
В Сурсе никаких подёргиваний нет, там рендер интерполирует между стейтами. Ты через ССЗБ-консоль можешь вообще -tickrate 11 выставить, но при этом визуально игра будет такая же плавная, никаких слайдшоу возникать не будет.
А вот чем реально такая интерполяция может не понравиться — это что появляется инпут лаг размером в период тика. Так как рендеру для интерполяции нужно как минимум два стейта, между которыми интерполировать — то ситуация на экране будет постоянно на 1 / tickrate позади "актуального" состояния мира. Если tickrate выставить по-нормальному, впрочем, то это не будет вызывать проблем. Ты вот, например, даже не знал о существовании этого инпут лага (иначе обязательно бы упомянул).
Skvoznjak
> А движение происходит всегда на целое количество пикселей?
Смещение объекта в апдейте:
vel = 60 pos += vel * fixed_update_dt
При рендере интерполяция
alpha = (время от начала апдейта до начала рендера) / fixed_update_time draw_pos = lerp(pos, pos_future, alpha)
Имбирная Ведьмочка
> вот чем реально такая интерполяция может не понравиться — это что появляется
> инпут лаг размером в период тика.
Инпут лаг заметен только для движения камеры/курсора - их можно обновлять на каждом кадре, без интерполяции, имея всегда последнее актуальное состояние.
Тема в архиве.
Тема закрыта.