1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00

optimize resizing and allocating packet send buffer;

This commit is contained in:
Alice Ogeda 2023-02-14 10:24:35 -03:00
parent f6acb8540d
commit ae605d5b0d
2 changed files with 24 additions and 15 deletions

View file

@ -99,6 +99,7 @@ namespace Sapphire::Network::Packets
/** The segment header */ /** The segment header */
FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr; FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr;
uint16_t m_segmentType; uint16_t m_segmentType;
std::size_t m_alignedSize;
public: public:
virtual size_t getContentSize() virtual size_t getContentSize()
@ -128,6 +129,15 @@ namespace Sapphire::Network::Packets
return m_segHdr.size; return m_segHdr.size;
} }
/**
* @brief gets aligned packet size
* @return packet size in bytes, to 8 byte %
*/
std::size_t getAlignedSize() const
{
return m_alignedSize;
}
/** /**
* @brief sets current packet size * @brief sets current packet size
* @param packet size in bytes * @param packet size in bytes
@ -182,6 +192,8 @@ namespace Sapphire::Network::Packets
// The size must be the sum of the segment header and the content // The size must be the sum of the segment header and the content
m_segHdr.size = static_cast< uint32_t >( sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + getContentSize() ); m_segHdr.size = static_cast< uint32_t >( sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + getContentSize() );
m_segHdr.type = getSegmentType(); m_segHdr.type = getSegmentType();
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
} }
}; };
@ -213,6 +225,8 @@ namespace Sapphire::Network::Packets
memset( &m_ipcHdr, 0, ipcHdrSize ); memset( &m_ipcHdr, 0, ipcHdrSize );
m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType ); m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType );
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
} }
size_t getContentSize() override size_t getContentSize() override
@ -271,6 +285,7 @@ namespace Sapphire::Network::Packets
m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType ); m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType );
m_ipcHdr.timestamp = Common::Util::getTimeSeconds(); m_ipcHdr.timestamp = Common::Util::getTimeSeconds();
m_segHdr.size = sizeof( T ) + sizeof( FFXIVARR_IPC_HEADER ) + sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ); m_segHdr.size = sizeof( T ) + sizeof( FFXIVARR_IPC_HEADER ) + sizeof( FFXIVARR_PACKET_SEGMENT_HEADER );
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
}; };
protected: protected:
@ -291,6 +306,7 @@ namespace Sapphire::Network::Packets
{ {
initialize(); initialize();
m_segHdr.size = size; m_segHdr.size = size;
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
}; };
FFXIVRawPacket( char* data, uint16_t size ) : FFXIVRawPacket( char* data, uint16_t size ) :
@ -300,6 +316,7 @@ namespace Sapphire::Network::Packets
memcpy( &m_data[ 0 ], data + segmentHdrSize, size - segmentHdrSize ); memcpy( &m_data[ 0 ], data + segmentHdrSize, size - segmentHdrSize );
memcpy( &m_segHdr, data, segmentHdrSize ); memcpy( &m_segHdr, data, segmentHdrSize );
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
} }
size_t getContentSize() override size_t getContentSize() override

View file

@ -26,13 +26,13 @@ void Network::Packets::PacketContainer::addPacket( Network::Packets::FFXIVPacket
{ {
m_entryList.push_back( entry ); m_entryList.push_back( entry );
m_ipcHdr.size += static_cast< uint32_t >( entry->getSize() ); m_ipcHdr.size += static_cast< uint32_t >( entry->getAlignedSize() );
m_ipcHdr.count++; m_ipcHdr.count++;
} }
void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer ) void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer )
{ {
std::vector< uint8_t > tempBuffer( m_ipcHdr.size ); std::vector< uint8_t > tempBuffer( m_ipcHdr.size, 0 );
memset( &tempBuffer[ 0 ], 0, m_ipcHdr.size ); memset( &tempBuffer[ 0 ], 0, m_ipcHdr.size );
using namespace std::chrono; using namespace std::chrono;
@ -55,24 +55,16 @@ void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >&
pPacket->setTargetActor( m_segmentTargetOverride ); pPacket->setTargetActor( m_segmentTargetOverride );
} }
auto validPacketDataSize = pPacket->getSize(); auto packetAlignedSize = pPacket->getAlignedSize();
auto packetOriginalSize = pPacket->getSize();
// check if packet is 8 byte aligned pPacket->setSize( packetAlignedSize );
auto alignCheck = validPacketDataSize % 8;
if( alignCheck != 0 )
{
// pad packet to boundary
// resize is expensive
tempBuffer.resize( tempBuffer.size() + alignCheck, 0 );
pPacket->setSize( validPacketDataSize + alignCheck );
}
// copy packet data into buffer // copy packet data into buffer
auto data = pPacket->getData(); auto data = pPacket->getData();
memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], validPacketDataSize ); memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], packetOriginalSize );
offset += validPacketDataSize + alignCheck; offset += packetAlignedSize;
} }
// buffer has possibly been resized for alignment // buffer has possibly been resized for alignment