Network/ENet: Add compressor support

This commit is contained in:
Jérôme Leclercq
2017-09-22 15:22:43 +02:00
parent 9a665bbff6
commit cc4fdf2476
5 changed files with 94 additions and 6 deletions

View File

@@ -0,0 +1,11 @@
// Copyright (C) 2017 Jérôme Leclercq
// This file is part of the "Nazara Engine - Network module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Network/ENetCompressor.hpp>
#include <Nazara/Network/Debug.hpp>
namespace Nz
{
ENetCompressor::~ENetCompressor() = default;
}

View File

@@ -521,6 +521,19 @@ namespace Nz
}
// Compression handling
if (flags & ENetProtocolHeaderFlag_Compressed)
{
if (!m_compressor)
return false;
std::size_t newSize = m_compressor->Decompress(peer, m_receivedData, m_receivedDataLength, m_packetData[1].data() + headerSize, m_packetData[1].size() - headerSize);
if (newSize == 0 || newSize > m_packetData[1].size() - headerSize)
return false;
std::memcpy(m_packetData[1].data(), header, headerSize);
m_receivedData = m_packetData[1].data();
m_receivedDataLength = headerSize + newSize;
}
// Checksum
@@ -922,7 +935,7 @@ namespace Nz
++m_bufferCount;
NetBuffer& packetBuffer = m_buffers[m_bufferCount];
packetBuffer.data = outgoingCommand->packet->data.GetData() + Nz::NetPacket::HeaderSize + outgoingCommand->fragmentOffset;
packetBuffer.data = outgoingCommand->packet->data.GetData() + NetPacket::HeaderSize + outgoingCommand->fragmentOffset;
packetBuffer.dataLength = outgoingCommand->fragmentLength;
m_packetSize += packetBuffer.dataLength;
@@ -1024,11 +1037,27 @@ namespace Nz
else
m_buffers[0].dataLength = NazaraOffsetOf(ENetProtocolHeader, sentTime);
// Compress packet buffers if possible
std::size_t compressedSize = 0;
if (m_compressor)
{
compressedSize = m_compressor->Compress(currentPeer, &m_buffers[1], m_bufferCount, m_packetSize - sizeof(ENetProtocolHeader), m_packetData[1].data(), m_packetData[1].size());
if (compressedSize > 0)
m_headerFlags |= ENetProtocolHeaderFlag_Compressed;
}
if (currentPeer->m_outgoingPeerID < ENetConstants::ENetProtocol_MaximumPeerId)
m_headerFlags |= currentPeer->m_outgoingSessionID << ENetProtocolHeaderSessionShift;
header->peerID = HostToNet(static_cast<UInt16>(currentPeer->m_outgoingPeerID | m_headerFlags));
if (compressedSize > 0)
{
m_buffers[1].data = m_packetData[1].data();
m_buffers[1].dataLength = compressedSize;
m_bufferCount = 2;
}
currentPeer->m_lastSendTime = m_serviceTime;
// Simulate network by adding delay to packet sending and losing some packets
@@ -1038,7 +1067,7 @@ namespace Nz
sendNow = false;
if (!currentPeer->m_packetLossProbability(s_randomGenerator))
{
Nz::UInt16 delay = currentPeer->m_packetDelayDistribution(s_randomGenerator);
UInt16 delay = currentPeer->m_packetDelayDistribution(s_randomGenerator);
if (delay == 0)
sendNow = true;
else
@@ -1159,7 +1188,7 @@ namespace Nz
++m_bufferCount;
NetBuffer& packetBuffer = m_buffers[m_bufferCount];
packetBuffer.data = outgoingCommand->packet->data.GetData() + Nz::NetPacket::HeaderSize + outgoingCommand->fragmentOffset;
packetBuffer.data = outgoingCommand->packet->data.GetData() + NetPacket::HeaderSize + outgoingCommand->fragmentOffset;
packetBuffer.dataLength = outgoingCommand->fragmentLength;
m_packetSize += packetBuffer.dataLength;