Проблема замера скорости по разнице между координатами, полученными в соседних по времени OnPlayerUpdate
#1

Предисловие
Не стоит писать, что по GetVehicleVelocity можно получить абсолютно точную скорость передвижения транспорта в любой момент времени - это так. Другой вопрос, что по разнице 2-х GetVehiclePos можно на данный момент лишь дать грубую оценку скорости движения машины.

Данная тема посвящена возникшим вопросам по синхронизации и определению скоростей движения транспорта.
На опыте было показано, что пройденное расстояние (указывается умноженное в 100 раз) между двумя соседними по времени вызова OnPlayerUpdate может отличаться друг от друга в несколько раз. Подобная проблема проявляется и с разницей по времени между 2-мя OnPlayerUpdate, но менее выражена. Возможное решение кроется, например, в замере с периодом 1 секунду (девиация скорости действительно уменьшается), но такой способ замера скорости слишком грубый - нет возможности учесть ускорение за эту секунду либо интегрировать за 1 секунду пройденное расстояние по каждому OnPlayerUpdate, но тогда замеры получатся очень инерционными - машина может остановиться, а скорость будет ещё долго спадать (чем больше размер выборки - тем более инерционно, но более точно для постоянной скорости). Это всё рассчитывалось прямым методом (взял координаты, время, посчитал разницы и вычислил скорость).


Условия тестирований
Место/маршрут проведения: внешнее кольцо шоссе ЛВ.
Постоянная скорость: максимальная для выбранного транспорта, девиация скорости (по GetVehicleVelocity) <0.5%.
ФПС: 50.
IP: localhost
Тест №1: 2 круга на Infernus, размер выборки=6683 (разниц величин в OnPlayerUpdate)
Тест №2: 3 круга на Turismo, размер выборки=12580 (разниц величин в OnPlayerUpdate)

Таблица 1. Гистограммы измеренных величин
ВеличинаТест №1Тест №2
Расстояние
Время
Скорость

Таблица 2. Параметры распределений
№тестаВеличинаМатематическое ожиданиеДисперсия
1Дистанция173.2307143850.134739
2Дистанция151.5419702932.528609
1Время28.17163096.652221
2Время28.23934899.437501
1Скорость6.2619681.772077
2Скорость5.5140382.175881
Вопросы:
  1. Каким законом наиболее точно аппроксимируются распределения по разнице времени и по скорости?
  2. Каким способом можно повысить точность вычисления скорости по пройденному расстоянию (или корректировать расстояние) так, чтобы за пару OnPlayerUpdate можно было рассчитать скорость с удовлетворительной скоростью (тупая интеграция 2х трапеций не вариант чёто)?
LOL
Reply
#2

Частота вызова OnPlayerUpdate зависит от количества данных, переданных от игрока. Для измерения скорости обязательно нужно использовать фиксированное время. Можно воспользоваться отдельным таймером или использовать GetTickCount в OnPlayerUpdate.
Reply
#3

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

Quote:
Originally Posted by ZiGGi
View Post
Частота вызова OnPlayerUpdate зависит от количества данных, переданных от игрока. Для измерения скорости обязательно нужно использовать фиксированное время. Можно воспользоваться отдельным таймером или использовать GetTickCount в OnPlayerUpdate.
В экспериментах и делалось именно так со временем.

Quote:
Originally Posted by White_116
View Post
Условно говоря клиент отправляет данные каждые 40мс. Но это в случае если игрок движется. Так же фпс может очень влиять на вычисление скорости, все относительно, клиент будет отсылать ускорение в н раз больше чем является само перемещение. Временые отметки в пакетах нужны...
По гистограмме можешь видеть, что время между соседними OnPlayerUpdate очень разная.
И откуда такая информация, что именно каждые 40 мс?
Reply
#5

Quote:
Originally Posted by Mutha_X
View Post
По гистограмме можешь видеть, что время между соседними OnPlayerUpdate очень разная.
И откуда такая информация, что именно каждые 40 мс?
Разная потому, что пинг играет роль + 0..5мс (поток спит - указывается в конфиге сервера). А 40 мс ты выставляешь в настройках сервера (стандартное значение). В игре при нажатии F5 видно данное время.
Reply
#6

Quote:
Originally Posted by White_116
View Post
Разная потому, что пинг играет роль + 0..5мс (поток спит - указывается в конфиге сервера). А 40 мс ты выставляешь в настройках сервера (стандартное значение). В игре при нажатии F5 видно данное время.
В игре указано 15 мс.
На сервере та же переменная 30 мс.
Ладно бы sleep 5.
Ладно бы просадок нет вообще (по фпс).
Ладно бы это единственное, что делает замеры в opu.
Откуда разница между OnPlayerUpdate выскакивает даже вдвое больше чем указанная величина на сервере?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)