Fixing lag compensation and make more smooth
This commit is contained in:
1 parent
82ca994fac
commit
7b1d9363a0
6 files changed
+159
-54
No files matched your search
@@ -157,6 +157,16 @@ void ClientState::apply_lag_compensation(std::chrono::system_clock::time_point n
|
||||
deltaMs = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - lastUpdateServerTime).count();
|
||||
}
|
||||
|
||||
long long deltaMsLeftover = deltaMs;
|
||||
|
||||
while (deltaMsLeftover > 0)
|
||||
{
|
||||
long long miniDelta = 50;
|
||||
simulate_physics(miniDelta);
|
||||
deltaMsLeftover -= miniDelta;
|
||||
}
|
||||
|
||||
/*
|
||||
// 3. Защита от слишком больших скачков (Clamp)
|
||||
// Если лаг более 500мс, ограничиваем его, чтобы избежать резких рывков
|
||||
long long final_lag_ms = deltaMs;//min(deltaMs, 500ll);
|
||||
@@ -165,7 +175,7 @@ void ClientState::apply_lag_compensation(std::chrono::system_clock::time_point n
|
||||
// Доматываем симуляцию на величину задержки
|
||||
// Мы предполагаем, что за это время параметры управления не менялись
|
||||
simulate_physics(final_lag_ms);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
void ClientState::handle_full_sync(const std::vector<std::string>& parts, int startFrom) {
|
||||
|
||||
@@ -202,6 +202,35 @@ namespace ZL {
|
||||
}
|
||||
}
|
||||
|
||||
if (msg.rfind("SNAPSHOT:", 0) == 0) {
|
||||
auto mainParts = split(msg.substr(9), '|'); // Отсекаем "SNAPSHOT:" и делим по игрокам
|
||||
if (mainParts.empty()) continue;
|
||||
|
||||
uint64_t serverTimestamp = std::stoull(mainParts[0]);
|
||||
std::chrono::system_clock::time_point serverTime{ std::chrono::milliseconds(serverTimestamp) };
|
||||
|
||||
for (size_t i = 1; i < mainParts.size(); ++i) {
|
||||
auto playerParts = split(mainParts[i], ':');
|
||||
if (playerParts.size() < 15) continue; // ID + 14 полей ClientState
|
||||
|
||||
int rId = std::stoi(playerParts[0]);
|
||||
if (rId == clientId) continue; // Свое состояние игрок знает лучше всех (Client Side Prediction)
|
||||
|
||||
ClientState remoteState;
|
||||
remoteState.id = rId;
|
||||
remoteState.lastUpdateServerTime = serverTime;
|
||||
|
||||
// Используем твой handle_full_sync, начиная со 2-го индекса (пропускаем ID в playerParts)
|
||||
remoteState.handle_full_sync(playerParts, 1);
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> pLock(playersMutex);
|
||||
remotePlayers[rId].add_state(remoteState);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
void WebSocketClient::Send(const std::string& message) {
|
||||
|
||||
Reference in new issue
Block a user