СУТЬ ПРОБЛЕМЫ:
Перебрав множество вариантов реализаций Интерполяции/Экстраполяции остановился на одной наиболее подходящей, но осталась одна проблема:
Соперник по задумке отсылает данные каждые 0.05 сек, но в реальности они приходят с разной задержкой из-за чего случаются лаги/рывки/дергания соперника:
0.050 - 5% случаев.
0.066 - 90% случаев.
0.082 - 5% случаев.
Если пакеты приходят стабильно через одинаковый интервал (напр. 0.066 сек), то все идеально.
ВИДЕО (на 5й секунде начинаются проблемы):
КОД:
Синтаксис:
Используется csharp
const float interval_send = 0.05f; // Шлем данные каждые 0.05 sec (50 ms)
// Получаем данные от соперника
void OnGetPosition(Vector3 _new_position, Vector3 _new_velocity)
{
last_position = transform.position;
new_position = _new_position;
new_velocity = _new_velocity;
float real_update_interval = (Time.time - lastUpdateTime); // для Дебага.
Debug.Log("Real Update Interval: " + real_update_interval); // 0.050.....0.066.....0.082 sec.
lastUpdateTime = Time.time;
}
void Update()
{
float pctDone = (Time.time - lastUpdateTime) / interval_send;
if (pctDone <= 1.01f)
{
trans.position = Vector3.Lerp(last_position, new_position, pctDone); // Интерполяция
}
else
{
trans.position = trans.position + (new_velocity *Time.deltaTime); // Экстраполяция
}
}
// Получаем данные от соперника
void OnGetPosition(Vector3 _new_position, Vector3 _new_velocity)
{
last_position = transform.position;
new_position = _new_position;
new_velocity = _new_velocity;
float real_update_interval = (Time.time - lastUpdateTime); // для Дебага.
Debug.Log("Real Update Interval: " + real_update_interval); // 0.050.....0.066.....0.082 sec.
lastUpdateTime = Time.time;
}
void Update()
{
float pctDone = (Time.time - lastUpdateTime) / interval_send;
if (pctDone <= 1.01f)
{
trans.position = Vector3.Lerp(last_position, new_position, pctDone); // Интерполяция
}
else
{
trans.position = trans.position + (new_velocity *Time.deltaTime); // Экстраполяция
}
}
Подозреваю, что надо в коде учитывать как-то эти временные задержки/скачки, но все что я пробовал пока не помогло.
Какие варианты?
Спасибо!