EntityUpdate server-side optimization

Cache net states of the same net version. Also moved readNetState after init in EntityCreate, should fix bugs like MovementController rotation not being read.
This commit is contained in:
Kae 2023-06-21 15:48:27 +10:00
parent d6fdd96076
commit acc8bc0280
5 changed files with 12 additions and 6 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

After

Width:  |  Height:  |  Size: 401 KiB

View File

@ -656,8 +656,8 @@ void WorldClient::handleIncomingPackets(List<PacketPtr> const& packets) {
}
auto entity = entityFactory->netLoadEntity(entityCreate->entityType, entityCreate->storeData);
entity->readNetState(entityCreate->firstNetState);
entity->init(this, entityCreate->entityId, EntityMode::Slave);
entity->readNetState(entityCreate->firstNetState);
m_entityMap->addEntity(entity);
if (m_interpolationTracker.interpolationEnabled()) {

View File

@ -392,8 +392,8 @@ void WorldServer::handleIncomingPackets(ConnectionId clientId, List<PacketPtr> c
}
auto entity = entityFactory->netLoadEntity(entityCreate->entityType, entityCreate->storeData);
entity->readNetState(entityCreate->firstNetState);
entity->init(this, entityCreate->entityId, EntityMode::Slave);
entity->readNetState(entityCreate->firstNetState);
m_entityMap->addEntity(entity);
if (clientInfo->interpolationTracker.interpolationEnabled())
@ -605,6 +605,7 @@ void WorldServer::update() {
signalRegion(monitoredRegion.padded(jsonToVec2I(m_serverConfig.get("playerActiveRegionPad"))));
queueUpdatePackets(pair.first);
}
m_netStateCache.clear();
for (auto& pair : m_clientInfo)
pair.second->pendingForward = false;
@ -1743,10 +1744,14 @@ void WorldServer::queueUpdatePackets(ConnectionId clientId) {
if (connectionId != clientId) {
if (auto version = clientInfo->clientSlavesNetVersion.ptr(entityId)) {
if (auto updateSetPacket = updateSetPackets.value(connectionId)) {
auto updateAndVersion = monitoredEntity->writeNetState(*version);
if (!updateAndVersion.first.empty())
updateSetPacket->deltas[entityId] = move(updateAndVersion.first);
*version = updateAndVersion.second;
auto pair = make_pair(entityId, *version);
auto i = m_netStateCache.find(pair);
if (i == m_netStateCache.end())
i = m_netStateCache.insert(pair, move(monitoredEntity->writeNetState(*version))).first;
const auto& netState = i->second;
if (!netState.first.empty())
updateSetPacket->deltas[entityId] = netState.first;
*version = netState.second;
}
} else if (!monitoredEntity->masterOnly()) {
// Client was unaware of this entity until now

View File

@ -347,6 +347,7 @@ private:
CollisionGenerator m_collisionGenerator;
List<CollisionBlock> m_workingCollisionBlocks;
HashMap<pair<EntityId, uint64_t>, pair<ByteArray, uint64_t>> m_netStateCache;
OrderedHashMap<ConnectionId, shared_ptr<ClientInfo>> m_clientInfo;
GameTimer m_tileEntityBreakCheckTimer;