![]() |
Синхронизация
Почему многие пытаются встроить синхронизацию (фиксацию ФПС) в несетевые игры?
Проще поставить ограничение на ФПС. если комп мощный то результат будет одинаковый, если слабый то в первом случае (фиксация) игра будет тормозить, а во втором идти медленно, что на мой взгляд, взгляд человека имеющего оченно слабый комп, предпочтительнее нежели тормоза. ПС. на размышление навела игра FlashShooter, или что то в етом роде. |
Re: Синхронизация
HolyDel, а чем отличается синхронизация от ограничения? и как реализовывается ограничение?
|
Re: Синхронизация
flip 0
while a_time>millisecs()-30 : Wend a_time=millisecs() , где 30 это 1000/НУЖНЫЙ ФПС. |
Re: Синхронизация
Фича в том, что между "игра летает" (ФПС более 40-60) и "игра тормозит" (ФПС менее 20) лежит довольно большой промежуток, в котором и живёт абсолютное большинство юзверей.
Допустим, игрок А имеет слабую машину, которая в нашем случае выдаст на-гора 20-25 ФПС. Естественно, он не хочет, чтоб его игра замедлялась, и искренне желал бы, чтоб ФПС в игре был жестко залочен на те же 20-25. С другой стороны медали у нас сидит игрок Б на своём скромном Кор3Трио/ГФ-80800/8Гб оперативных мозгов. И ему совсем не хочется видеть на его голубом 30-дюймовом дисплее жалкие 25ФПС, которые хоть и не мешают восприятию игры, но эстетически никак не вдохновляют. Ибо ежели приглядеться, легкие мерцания заметны. А ничто так не заставляет приглядеться к игре, как большой и очень дорогой компьютер. В итоге получаем конфликтикъ-с интересов. Именно этот конфликт и решается с помощью синхронизации. Ессно, применять ёё, как и всё остальное, нужно с умом. ФПС выше астрономических величин- 60? 70? 100? - можно и залочить, чтоб не прыгал, а ФПС ниже 20- лочить отключением синхронизации необходимо- ибо тормоза и рывки хуже плавного замедления. ИМХО. ) |
Re: Синхронизация
ограниечение реализуется через обычный таймер.
createtimer(x) ... waittimer() А синхронизация делается через captureworld(). В примере castle такое реализовано. По вопросу holydela отвечу так: думаю многие просто не задумывались на этот счет. |
Re: Синхронизация
H@NON
очень многие задумывались :) я в общем сделал так : фпс ограничивается на 60 кадров в сек обычным циклом если фпс меньше 60 то врубается обработка глобальной переменной DeltaTime ... ета переменная щитается от фпс в 65 кадров\сек конечное значение DeltaTime щитается как среднее арифметическое от 32 последних значений ( DeltaTime в буфер щитается каждый цикл ... но значение задается только когда фпс < 60 ) такую стабилизацию я проверяю просто - Delay(Rand(0,70)) и знаете - игра работает идеально ... ps. чтобы удавалось достичь плавной стабилизации мне потребовалось использовать высокоточный таймер - до микросекунды (в блице можно только до милисекунды) |
Re: Синхронизация
Я в WoodCutters вообще ФПС не ограничивал, сделал по-другому - создал зависимость активных действий от промежутка обрабатываемого времени в одном цикле. Т.е. если за минуту юниту надо пробежать 5 единиц, то он их пробежит при любом ФПС, только если ФПС=20, то за 20 итераций по 5/20 единиц, а если 60 - за 60 по 5/60 единиц. При этом, как мне кажется, тормозов в принципе не будет при любом ФПС.
|
Re: Синхронизация
stone_evil
ну ето в общем и есть DeltaTime :) |
Re: Синхронизация
Цитата:
|
Re: Синхронизация
Народ, подскажите ссылочку, где можно скачать оптимальный счетчик фпс. Спасибо.
|
Re: Синхронизация
Код:
;------------------------------------------ |
Re: Синхронизация
H@NON, вот у тебя в этом коде используется стабилизатор из стандартных templat'ов в Blitz3D\IDE. Так вот я его тоже использую, его принцип таков: Указывается постоянный UPS, и далее если из-за фпс, упс падает, то не рендерить данный цикл, пока упс не отстабилизируется до заданного. Походу мы все говорим практически ободном.
В чём выигрывает такая система, чем то как делал stone_evil или jimon умножая скорость логических действий, на опр коэфицент стабилизации, тем что есть такие операции которые Только выводят, например Glow или DoF, там есть CopyRect и RenderWorld которые задуйствованы Больше 1 раза, при этом если упс падает, мы не делаем эти действия и не выводим картинку, тем самым производительность вырастет по сравнению с DeltaTime. Цитата:
Вот мне нравиться Source Engine, там тот же SiN Episodes идёт на моём (бывшем, ы обновил железо!) компе, и может идти с более крутыми настройками на крутых машинах, при этом местами игра просто идёт гладенько, но местами и тормозит. Я считаю что Самое важное это стабильность логики, а не изображения. И от сюда мы имеем, что если у нас оптимальная графика, то не придётся ограничивать игрока фпсом, а если у него машина слабая, то он будет уверен, что этот вот монстр, будет бежать это время, и игрок успеет сделать финт который требует затрат времени, где на разных машинах оно будет одно и тоже. |
Re: Синхронизация
MoKa
количество проходов обновления логики - целое число DeltaTime - число с плавающей запятой из-за етого возможны рывки ... имхо если DeltaTime > 4 то лутче отрубать рендер и обновлять только логику если DeltaTime < 4 то вырубание рендера даст рывки на екране у мну вырубание рендера пока технически не возможно :) лан поживем посмотрим ... хотя то что я сделал пока довольно стабильно живет но у меня проект где основная нагрузка идет на рендер (8 - 15 ms рендер против 0.2 - 0.8 ms обновление логики) |
Re: Синхронизация
jimon, ну разумееться не целое число, это и мне понятно. Тут дело в другом, именно в том что при мною употребляемой системе, которую отписал в примере H@NON, и использует сокращённую её версию HolyDel, не даёт рывков, (рывок это ты про слабый фпс, или про Рывки? :) ).
|
Re: Синхронизация
еще раз о сути проблемы.
вся проблема именно в рывках (т.е. когда итгра замирает на секунду, а потом сразу все изменилось, ту у противоположно стены, появилось еще 6 противников из ниоткуда и т.д.) Diplomat, солидарен. тогда вопрос в другом,почему никто неограничивает нижний фпс? |
Re: Синхронизация
Почему такие задержки? Логика то просчитывается, инпут тоже с ней стабильны. Если используються алгоритмы которые заставляют машину просто умирать, то задача оптимизировать алгаритмы. При этом у меня небыло таких проблемм, если игра лагует, то постоянно, а не такими рывками.
|
Re: Синхронизация
смотри FkashShooter, там вис происходит когдавзрывается корабль.
|
Re: Синхронизация
Ну вот, пример, чтобы не допускать таких ошибок! Это как в CellFractor, кидаешь магнитную гранату, и потом подстволку туда, и если нету PPU, то рывок - что есть плохо. Какраз тут не в синхронизации дело, нужно уже оптимизировать сами игровые процессы и визуальные действия в игре.
|
Re: Синхронизация
Я тоже задействовал систему, которую отписал в примере H@NON. Всё работает на ура, но небольшое мерцание всё же есть, особенно при поворотах камеры. Его возможно побороть?
Цитата:
Разве интересно будет играть в "плавную" кваку при 25фпс ? |
Re: Синхронизация
Цитата:
|
Re: Синхронизация
а я делаю как жимон тока просчитываю дельтаа не за 30 предудущих кадров а за 1. ибо за 30 слишкм много. можно сделать скажем за 5 кадров..
|
Re: Синхронизация
FLashMP, это VSync отключен - вывод изображения на экран, не ждёт пока картинка полностью сверху вниз обновиться, а продолжает обновлять, поэтому в играх с быстрой камерой - Action\Racings не советую выключать VSync. Выключается он просто: "Flip 0". А чтобы обратно включить, как и по стандарту тогда "Flip", но при этом показатель ФПС будет идеально реальным, т.к. будет учитываться только те кадры, которые полностью выводили на экран изображение.
|
Re: Синхронизация
FlashMP, число поликов тут ни при чем. Рендер то происходит редко (4 раза в секунду) при 4 ФПС.
в чем суть. Допустим у нас маленький фпс, тогда логика игры выполняется много раз , это еще больше замедляет игру, и некотое время идет эдакая цепная реакция) MoKa, посмею возразить, что отключать VSYnc все же надо, ставьте цикл который дает ту же задержку что и Flip 0. просто когда мы ставим 1-цу то игра стоит и ничегошеньки не делает, пока наконец перерисовка не закончится, а это ни есть гуд. |
Re: Синхронизация
Leito
если не смазывать DeltaTime то у меня все равно были рывки к примеру по таблице render time идут такие числа : 12 ms, 12 ms, 100 ms, 11 ms, 10 ms в таком случае когда рендер зашкалит под сотню мс то дельта тайм тоже резко увеличится .... а следуйший кадр рендерится уже только 11 мс что приведет к резкому рывку дело в том что дельта тайм должен показывать предположительное изменение скорости для следуйшего кадра |
Re: Синхронизация
jimon, а если 10мс, 11мс,100мс,110мс,99мс,11 мс, 12 мс?? или такого не бывает...
всетаки думаю нада ставить 5 кадров... 30 кадров слишком долго будит "отмазываться" на шустрых рендерах + логика. |
Re: Синхронизация
Leito
не принципиально особо я просто говорю что не надо юзать без учета предыдущих результатов :) |
Re: Синхронизация
А я просто завожу переменную, равную времени, что прошло с прошлого вызова метода Update и умножаю ее на все переменные, что управляют сдвигом, вращением и т.п.
|
Re: Синхронизация
JohnK, одно и тоже что делаю я. но у тя скорости тогда псевдочисла....
я умножаю на число к примеру 1.1 0.92 тоесть изменение от нормального состояния(при 50 ФПСах). а у тя 20,30,34... лучше сделай как у меня. удобнее будит. |
Re: Синхронизация
Ну дык мне и так удобно :)
|
Re: Синхронизация
Я перепробовал все.
И вернулся к банальному, примитивному WaitTimer |
Re: Синхронизация
tormoz
хм ... :) жжош :) че все так плохо было ? |
Re: Синхронизация
Комбинированный способ оч часто выкидывает сюрпризы на разном железе.
Типа у тебя все ок, а как даш блондинам и блондинкам на тесты - начинаются косяки. А вайттаймер никогда не подводит :) |
Часовой пояс GMT +4, время: 18:18. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot