Заполнение с контекстом из вашего previous question, я понимаю, что вы отправляете лопатка & мяч позиции от каждого клиента к другому. Однако, пока клиенты соглашаются, где весла находятся в каждый момент времени, движение шара полностью определяется (исключая ошибки округления), и вы должны экспериментировать с нулевым шариком. Каждый клиент должен иметь собственное внутреннее состояние с положением и скоростью лопастей и мяча. Псевдокод будет похож на следующее:
// input thread
if input changed,
alter paddle speed and/or direction
send timestamped message to inform my opponent of paddle change
// incoming network thread
if paddle packet received
alter opponent's paddle speed and/or direction at time it was sent
fix any errors in previously extrapolated paddle position <--- Easy
if ball-packet received
fix any errors in ball position and speed <--- Tricky
// update entities thread
for each entity (my paddle, opponent paddle, the ball)
compute updated entity position, adjusted by time-since-last-update
if ball reached my end, send ball-packet to other side
draw updated entity
Это предполагает, что происходит обмен двух типов пакетов:
- весло пакеты датируемые позиции + скорости весел, и посылаются всякий раз, когда клиент изменяет скорость собственного весла.
- Шариковые пакеты - это временные позиции + скорости мяча и отправляются всякий раз, когда мяч достигает стороны клиента (локальной), независимо от того, отскакивает ли она от весла или нет.
Псевдокод выполняет экстраполяцию («предположим, что все продолжает двигаться как обычно») для всех неизвестных в потоке объектов обновления. Единственный момент, когда возникают проблемы, отмечен стрелками <---
.
Вы можете легко исправить положение лопастей, деформируя их в новое положение, возможно, интерполируя движение за короткий промежуток времени, чтобы сделать его менее резким.
Исправить положение мяча легко, если оба клиента более или менее согласны (и затем вы можете снова сделать интерполяционный трюк, чтобы сгладить его дальше). Тем не менее, один клиент может видеть близость, а другой - ближний удар. В этом случае, поскольку вы используете одноранговую модель, мы позволяем локальному клиенту совершать вызов и объяснять, что произошло с противником (в другом дизайне у вас будет центральный сервер, принимающий такие решения; это хорошо, чтобы избежать обмана). Вы не можете избегать уродливого прыжка там, если оба клиента не согласны - но, надеюсь, это должно быть относительно редко и коротко, если оно не совпадает с пингом пинга.
Кстати, вы измеряли ping/fps? – Ivan
@ Ivan Я измеряю Ping, да. Тем не менее, я не использую его в данный момент. – Z0q
Я спрашиваю об этих показателях, чтобы мы могли количественно определить, что такое «немного лагги» и в каких обстоятельствах. Например. если ваш пинг составляет 900 мс, в основном любой опыт в порядке – Ivan