Network/ENet: Add compressor support
This commit is contained in:
11
src/Nazara/Network/ENetCompressor.cpp
Normal file
11
src/Nazara/Network/ENetCompressor.cpp
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user