Optimize player update sending

master
Nicole Collings 2020-02-20 22:44:16 -08:00
parent 391a90d399
commit 96e03db1d6
5 changed files with 33 additions and 25 deletions

View File

@ -94,6 +94,7 @@ void ClientNetworkInterpreter::receivedPacket(std::unique_ptr<Packet> p) {
id = d.read<unsigned int>();
player.setPos(d.read<glm::vec3>());
player.setPitch(d.read<float>());
player.setYaw(d.read<float>());
break;
}
@ -107,8 +108,8 @@ void ClientNetworkInterpreter::receivedPacket(std::unique_ptr<Packet> p) {
if (entity.getCid() == cid) {
// Update an existing PlayerEntity
entity.interpPos(d.read<glm::vec3>());
entity.interpRotateZ(-d.read<float>() + 90);
entity.interpRotateY(-d.read<float>() + 90);
entity.interpRotateZ(-d.read<float>());
found = true;
break;

View File

@ -35,20 +35,18 @@ void Server::update() {
while (handler.update(&event) && loop.elapsedNs() < interval_ns) {
switch (event.type) {
default:
case ENET_EVENT_TYPE_NONE:
case ENET_EVENT_TYPE_NONE: {
std::cout << "Unknown packet type: " << event.type << std::endl;
break;
}
case ENET_EVENT_TYPE_CONNECT: {
clientList.handleConnect(event);
break;
}
case ENET_EVENT_TYPE_DISCONNECT: {
clientList.handleDisconnect(event);
break;
}
case ENET_EVENT_TYPE_RECEIVE: {
Packet p(event.packet);
ServerClient* client = static_cast<ServerClient*>(event.peer->data);
@ -70,7 +68,6 @@ void Server::update() {
clientList.createPlayer(clientShared);
}
}
break;
}
}
@ -78,6 +75,25 @@ void Server::update() {
enet_packet_destroy(event.packet);
}
for (auto& pair : playersUpdated) {
unsigned int cid = pair.first;
auto client = clientList.getClient(cid);
if (client == nullptr) continue;
Packet r(PacketType::PLAYER_INFO);
r.data = Serializer()
.append(client->cid)
.append(client->getPos())
.append(client->getPitch())
.append(client->getYaw())
.data;
for (auto& iter : clientList.clients)
if (iter->cid != cid && glm::distance(client->getPos(), iter->getPos()) < 200)
r.sendTo(iter->peer, PacketChannel::ENTITY);
}
playersUpdated.clear();
long sleep_for = interval_ns - loop.elapsedNs();
if (sleep_for > 0) std::this_thread::sleep_for(std::chrono::nanoseconds(sleep_for));
@ -91,31 +107,15 @@ void Server::handlePlayerPacket(ServerClient &client, Packet& p) {
std::cout << Log::err << "Invalid packet type (" << static_cast<int>(p.type) << ") recieved." << Log::endl;
break;
}
case PacketType::THIS_PLAYER_INFO: {
Deserializer d(p.data);
client.setPos(d.read<glm::vec3>());
client.setPitch(d.read<float>());
client.setYaw(d.read<float>());
//Send All ClientList the new positon
Packet r(PacketType::PLAYER_INFO);
r.data = Serializer()
.append(client.cid)
.append(client.getPos())
.append(client.getPitch())
.append(client.getYaw())
.data;
for (auto& iter : clientList.clients) {
if (iter->cid != client.cid) {
r.sendTo(iter->peer, PacketChannel::ENTITY);
}
}
playersUpdated.emplace(client.cid, true);
break;
}
case PacketType::BLOCK_SET: {
Deserializer d(p.data);
@ -138,7 +138,6 @@ void Server::handlePlayerPacket(ServerClient &client, Packet& p) {
def.callbacks[Callback::PLACE](defs.parser.vecToTable(pos));
}
}
break;
}
}

View File

@ -32,6 +32,8 @@ private:
ClientList clientList;
ServerConfig config;
std::unordered_map<unsigned int, bool> playersUpdated {};
double elapsedSeconds = 0;
double deltaTime = 0;

View File

@ -52,4 +52,9 @@ void ClientList::createPlayer(std::shared_ptr<ServerClient> c) {
.data;
p.sendTo(c->peer, PacketChannel::ENTITY);
}
}
const std::shared_ptr<ServerClient> ClientList::getClient(unsigned int cid) const {
for (auto& c : clients) if (c->cid == cid) return c;
return nullptr;
}

View File

@ -16,6 +16,7 @@ public:
void handleDisconnect(ENetEvent e);
void createPlayer(std::shared_ptr<ServerClient> c);
const std::shared_ptr<ServerClient> getClient(unsigned int cid) const;
std::vector<std::shared_ptr<ServerClient>> clients;
private: