|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
Как правильно называется принцип равномерного движения при разных FPS05.01.2014, 21:56. Показов 2228. Ответов 22
Метки нет (Все метки)
Всем добрый день, кто может подсказать, как правильно называется или может, кто-то уже описывал данный принцип равномерного движения при разных FPS?
Что интересует, при локальной обработке, из-за разных причин FPS может быть разным и если скорость забить константой, то кто-то будет двигаться слишком быстро, а кто-то болтаться как улитка. По этому, как я почитал, используют время прошлого кадра сцены и добавляют это время в зависимость к скорости. И оно таки помогает. Сейчас хочу реализовать взаимодействие с сервером и не совсем понятно, как регулировать эту скорость через сервер? Чтобы реализовать client prediction нужно знать эту скорость заранее на клиенте, чтобы плавно передвигать модель, по этому я так понимаю, что я не могу завязываться на сервер. В общем может кто-то уже имел опыт с подобный? Предполагается движения в 3д мире. А так же возможность изменения скорости движения.
0
|
|
| 05.01.2014, 21:56 | |
|
Ответы с готовыми решениями:
22
Как называется принцип? Работа с таймером при разных fps? Моделирование равномерного и ускоренного движения в реальном времени |
|
|
|
| 06.01.2014, 00:29 | |
|
Ну обычно клиент и сервер пишут одни и те же люди, и они знают, с какой частотой сервер обновляет внутри себя данные. А если даже нет - кто мешает спросить у него это при подключении? Или что вас интересует?
0
|
|
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|||||||||||
| 06.01.2014, 01:14 [ТС] | |||||||||||
|
Меня интересует синхронизация скорости перемещения клиента с сервером.
На пример формула расчета скорости:
При всем этом, еще если еще учесть изменение скорости, по типу:
0
|
|||||||||||
|
480 / 253 / 51
Регистрация: 30.06.2010
Сообщений: 651
|
|
| 06.01.2014, 01:15 | |
|
Возможно, будет полезно http://habrahabr.ru/post/136878/
1
|
|
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
| 06.01.2014, 01:50 [ТС] | |
|
Хорошая статья
Но не дает ответ, что делать с сервером. Можно найти, где хранятся данные ограничения обработки и изменить их увеличив свою скорость.
0
|
|
|
|
||
| 06.01.2014, 13:46 | ||
|
0
|
||
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
| 06.01.2014, 21:52 [ТС] | |
|
Так вот я и не пойму, как сервер должен делать это. Как мне на клиенте реализовать prediction если клиент не знает с какой скоростью ему двигаться.
0
|
|
|
|
|
| 07.01.2014, 01:23 | |
|
Предположим, что у нас есть персонаж, который бежит со скоростью 2 м/с. Считается, что сервер N (допустим, 100) раз в секунду обновляет состояние мира. Фактически это означает, что каждые 10 мс он должен выдавать клиентам очередное состояние в момент времени t0 + i * 10 мс.
При этом у сервера персонаж движется со скоростью 0.02 м за один тик. У первого клиента, предположим, FPS = 50. Это значит, что он отрисовывает каждый второй тик сервера, при этом на каждом кадре он перемещает персонажа на 0.04 м вперед (что персонаж имеет скорость 2м/с - он знает). У второго клиента FPS = 60. Неудобно, т.к. не укладывается целое число тиков, но ничего страшного в этом нет. Просто за один кадр смещаем персонажа на 0.(3) м вперед. Поскольку сервер нам не говорит, что его скорость меняется, то целых 60 кадров мы его так и перемещали, а потом (раз в секунду) запросили у сервера не только скорости, но и координаты всех объектов. Выяснилось, что персонаж отстал на какие-нибудь 0.00031415 м от реального положения (как на сервере) - так переместим его куда надо. В общем, все скорости задаются в единицах в секунду, а не в единицах в кадрах. И именно к этим величинам клиенты и серверы подгоняют свои фактические перемещения.
0
|
|
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
| 07.01.2014, 15:05 [ТС] | |
|
Так, а как клиент знает, что персонаж имеет скорость 2м\с? Потом клиент, на пример, включает нитро и должен уже перемещаться 10м\с. Потом использует транспорт и скорость 20м\с + нитро. Эта часть должна дублироваться на клиенте, чтобы он знал, как ему двигаться или сервер каким-то образом должен сообщить о скоростях?
0
|
|
|
7 / 7 / 2
Регистрация: 12.02.2012
Сообщений: 47
|
|
| 08.01.2014, 16:29 | |
|
а нельзя чтобы всё считал только сервер ? результаты вычислений отправляются на клиенты для обновления данных. не надо никакой синхронизации. ведь так проще всего.
0
|
|
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|||
| 08.01.2014, 17:17 | |||
|
При этом при поступлении команды с сервера нужно учитывать, что она был отдана не только что.
0
|
|||
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
| 08.01.2014, 21:58 [ТС] | |
|
Ну у меня была идея сделать возможность установки разных скоростей, чтобы на сервере создал нового маунта, на пример, и проставил ему свою скорость и тогда клиент будет на нем перемещаться чуть быстрее, чем кто-то на другом. Но в таком случае получается, что пока на клиент не будет этих данных, то я не смогу нормально двигаться.
Ну и исходя из всего этого, я так понял, что совет в том, чтобы использовать Frame based движение? Хотя все равно я не пойму, какой толк. ФПС то величина плавающая, как раньше приводили пример, что у одног ФПС 50, он будет двигаться со скоростью 0.02. Но через пару сек, он может попасть в локацию, где его ФПС просядет или наоборот увеличится и соответственно скорость нужно уже рассчитывать не от 50 ФПС, а от нового значения. Одна беда заниматься этим геймдевом
0
|
|
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
||
| 09.01.2014, 03:23 | ||
|
Но с большим лагом в любом случае беда, нельзя просто так сходу в лоб выполнять даже локальные команды, никакой синхронизации в таком случае у клиентов получить не удастся. Либо всегда ждать подтверждения от сервера, что приведёт к очевидной для игрока задержке перед выполнением команды, либо таки начинать действие и уже потом как-то интерполировать ситуацию, но из этого будут проистекать логические нестыковки, причём временами тоже очевидные. Причём тут FPS, я не понял, привязывать логику к отображению нехорошо.
0
|
||
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
| 09.01.2014, 22:30 [ТС] | |
|
Из статьи, что показали выше, я думаю, буду пробовать метод "Постоянная скорость игры, независящая от переменного FPS". Но из-за отсутствия опыта работы в этой сфере у меня в голове не проявляется картинка, как клиент должен рассчитывать скоростя, как он узнает о них, чтобы потом нормально предсказывать у себя? Может кто-то может псевдокод накидать или таки как-то объяснить это?
0
|
|
|
7 / 7 / 2
Регистрация: 12.02.2012
Сообщений: 47
|
|
| 10.01.2014, 00:21 | |
|
не могу подсказать на счет отношений клиент-сервер, но могу подсказать про метод "Постоянная скорость игры, независящая от переменного FPS":
1.вычисляешь время выполнения одного кадра в долях секунды в моём примере(см. прикрепл файл) это переменная GlobalStep в модуле VideoThreadUnit.pas. для замеров времени выполнения участков кода (время выполнения одного кадра) я использую RDTSC, что и рекомендую. кстати FPS = 1 / GlobalStep; Если FPS измеряется в Герцах (Гц), то соответственно размерность GlobalStep : Гц-1 2.в формулу расчета перемещения объекта общий вид которой X := X + dX где X текущая координата объекта, а dX - скорость, т.е. величина изменения координаты объекта в каждом кадре. так вот в эту формулу вставляется эта самая вычисленная переменная GlobalStep. и формула становится: X := X + GlobalStep * dX теперь вне зависимости от FPS объект перемещается по оси X с постоянной скоростью dX , размерность скорости : длина/секунда. в моем примере эта формула видна в методе TPlaneta.TransformBeforeGlobal в модуле Unit_SolSystemObjects, вот она: Ugol := Ugol + GlobalStep * VAParamSolP[NumPlanet].UgSpeed только в моем примере изменяется не расстояние, а угол в радианах. и поэтому у меня в примере планета Юпитер вращается с угловой скоростью 2 радиана в секунду (рад/сек), Меркурий - ПИ рад/сек, Уран - 1 рад/сек ровно и плавно вне зависимости от FPS, которая постоянно скачет, что видно как цифра в левом верхнем углу.
0
|
|
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
| 10.01.2014, 00:48 | |
|
Не по теме: Я тред не читал, ответил на первое попавшееся сообщение, по ссылкам тем более не ходил. Для отвязки от фпс достаточно считать логику не с фиксированной дельтой времени, а с вычисляемой. То есть объект при постоянной скорости перемещается не на speed * const_tick, а на speed * время_прошедшее_после_предыдущего_расчёт а. Небольшой пример по компенсации задержки: путь объект двигался со скоростью v = 3, на текущий момент игрового времени t = 5c он будет в точке 15(дело происходит на прямой). Нам приходят данные, что другой клиент в момент t = 4c добавил ему две единицы скорости, тогда в синхронизированном состоянии объект должен находиться на координате 17. В принципе можно было бы его прямо там и отобразить, но выглядел бы этот скачок некрасиво. Вместо этого мы сводим состояния постепенно, например, к t = 6с. И вот в эту секунду мы показываем игроку такие картинки, будто бы объект двигается со скоростью v = 9(реально в синхронизированном состоянии скорость всё так же v = 7), отыгрывая тем самым разницу.
0
|
|
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
| 10.01.2014, 01:55 [ТС] | |
|
Ребят спасибо за ответы! Но это не много не то) Как двигать и какой метод использовать это уже другой вопрос, мне бы сейчас подошел и метод, где клиент с 15, рывком прыгает на 17
![]() Я в упор не понимаю, как клиент, знает, что ему нужно переместиться на 2... То есть, как мне сказали, что данные с клиента на сервер не должны уходить, только запросы. То есть получается, что-то вроде того, я на клиенте нажал вперед и после этого отправился пакет типа "Запрос на шаг вперед", сервер ловит его, сервер знает скорость, берет у себя считает может ли клиент туда пойти и отправляет назад "Переходи в 17, скорость 2", я сохраняю эту скорость локально и делаю "предсказание", с учетом этой скорости, когда она изменится и сервер пришлет новую "Переходи в Х, скорость 10", то я перезатру старую и буду "предстказывать" по новой. Но тогда получается, что первый шаг, я должен дождаться ответ от сервера со скоростью, чтобы знать сохранить ее. А потом уже используя, то, что писали вы, дельты времени, расчет времени выполнения и т.п. я смогу(теоретически) делать над известной скоростью, то есть если я уже знаю, что она у меня 2 и у меня например специально ограничен ФПС до 25, то я буду эти 2 разбивать на мелкие куски для 25 кадров. Тогда, как-то странно получается с первым шагом, раз скорости еще нет, я не могу делать плавное перемещение, выходит клиента должно как-бы дернуть... Ну или тогда присылать скорость в пакете сразу при входе в игру, как только клиент появился в мире... Вот, я это себе представляю, как-то так. Но я не уверен, что это правильный вариант. Если это верный алгоритм, то для начала я мог бы замутить и без предсказаний, пусть и с рывками, а потом бы уже оптимизировал. Но я не знаю, как этот алгоритм "общения" правильно реализовать.
0
|
|
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
||
| 10.01.2014, 03:11 | ||
|
Все данные, необходимые для симуляции игрового процесса от и до, за исключением действий игроков у каждого клиента есть ещё до начала партии. Добавлено через 6 минут Хотя, конечно, можно вообще всё считать на сервере, а клиентам непрерывно отдавать готовые снимки ситуации. Но при сколько-то большом количестве изменений это приведёт к высокой нагрузке на сеть, что ни есть хорошо. С другой стороны полная секурность: игрок не сможет вытянуть из клиентской программы излишние данные, если их там не будет вообще.
0
|
||
|
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
||
| 10.01.2014, 13:00 [ТС] | ||
|
0
|
||
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
| 10.01.2014, 13:19 | |
|
Что мешает на клиенте выполнить тот же самый скрипт?
Ну а если предсказать изменение невозможно, то да, каждый раз слать. Причём необязательно каждое незначительное изменение. В принципе, если объект будет двигать пару секунд с постоянной скоростью 300 вместо переменной 270..320, игрок этого не заметит, а по получению данных за всё время состояние можно синхронизировать. Вообще я бы посоветовал начать с чего-нибудь простого(пошаговая игра, например) и накручивать фичи постепенно, а не влезать сразу в дебри по самые уши.
0
|
|
| 10.01.2014, 13:19 | |
|
Помогаю со студенческими работами здесь
20
Кинематика равномерного и неравномерного вращательного движения (физические величины)
Прогер на AT90USB162 как называется правильно? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|