Skip to content

Commit

Permalink
Fix (GameEngine, Server): Trying to fix send ack with thread
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasjuin1 committed Jan 10, 2024
1 parent 5712066 commit 21bd69e
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
29 changes: 23 additions & 6 deletions GameEngine/src/Network/Connection/Connection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,19 @@ class Connection {
};

void ResendNeedAck(Exodia::Network::UDPSocket &socket) {
_mutexNeedAckLock();
for (auto packet : _packetNeedAck) {
SendPacketAck(socket, packet.second);
}
_mutexNeedAckUnlock();
}

void RemovePacketNeedAck(uint64_t id) {
try {
this->_threads.emplace_back([this, id]() {
_mutexNeedAckLock();
_packetNeedAck.erase(id);
} catch (std::exception &e) {
EXODIA_CORE_ERROR("Error: {0}", e.what());
}
_mutexNeedAckUnlock();
});
}

std::unordered_map<uint64_t, std::shared_ptr<Exodia::Network::Packet>> &GetPacketNeedAck() {
Expand All @@ -64,7 +66,7 @@ class Connection {
std::cout << packet->GetBuffer().size() << std::endl;
socket.Send(packet, _endpoint);
if (packet->GetHeader().GetIsImportant()) {
_packetNeedAck[packet->GetHeader().GetId()] = std::make_shared<Exodia::Network::Packet>(packet);
AddPacketNeedAck(std::make_shared<Exodia::Network::Packet>(packet));
}
_id++;
_networkInfo.kiloByteSent += packet->GetBuffer().size() / 1024.0f;
Expand All @@ -83,7 +85,6 @@ class Connection {
_networkInfo.kiloByteSent += packet->GetBuffer().size() / 1024.0f;
_networkInfo.sendPacket++;
_networkInfo.lastPacketSent = packet;
RemovePacketNeedAck(_id);
}

NetworkInfo GetLastNetworkInfo() { return _lastNetworkInfo; }
Expand Down Expand Up @@ -159,14 +160,30 @@ class Connection {

void SetLastId(int lastId) { _lastId = lastId; }

void _mutexNeedAckLock() { _mutexNeedAck.lock(); }

void _mutexNeedAckUnlock() { _mutexNeedAck.unlock(); }

protected:

private:

void AddPacketNeedAck(std::shared_ptr<Exodia::Network::Packet> packet) {
this->_threads.emplace_back([this, packet]() {
_mutexNeedAckLock();
_packetNeedAck[packet->GetHeader().GetId()] = packet;
_mutexNeedAckUnlock();
});
}
private:
asio::ip::udp::endpoint _endpoint;
int _lastId = -1;
int _id = 0;
NetworkInfo _networkInfo;
NetworkInfo _lastNetworkInfo;
uint64_t _worldId = 0;
std::mutex _mutexNeedAck;
std::vector<std::thread> _threads;
std::unordered_map<uint64_t, std::shared_ptr<Exodia::Network::Packet>> _packetNeedAck;
};

Expand Down
10 changes: 9 additions & 1 deletion Server/src/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,15 @@ namespace Exodia {
EXODIA_INFO("Server is running !");

try {

this->_ResendNeedAckThread = std::thread([&] {
while (_Running) {
for (auto connection : _Network.GetConnections()) {
connection.second->ResendNeedAck(_Network.GetSocket());
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
});
while (_Running) {
CheckForNewClients();

Expand Down Expand Up @@ -290,7 +299,6 @@ namespace Exodia {
events.pop_back();
}

_Network.ResendNeedAck();
Scenes[CurrentScene]->OnUpdateRuntime(timestep);
} catch (std::exception &error) {
EXODIA_ERROR("Unable to update the world :\n\t{0}", error.what());
Expand Down
3 changes: 3 additions & 0 deletions Server/src/Server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ namespace Exodia {
void CheckForNewClients();
void CheckConnectedClients();
std::vector<Exodia::User> _Users;

// Thread to Resend Need Ack
std::thread _ResendNeedAckThread;
};
}; // namespace Exodia

Expand Down

0 comments on commit 21bd69e

Please sign in to comment.