Reserve space for NetworkStrings (to reduce copying when reallocating).

This commit is contained in:
hiker
2015-10-16 00:03:23 +11:00
parent e7860e1c14
commit 9a55da5c2c
11 changed files with 57 additions and 53 deletions

View File

@@ -101,7 +101,7 @@ void* waitInput(void* data)
else if (NetworkManager::getInstance() &&
NetworkManager::getInstance()->getPeers().size() > 0)
{
NetworkString msg;
NetworkString msg(1+str.size());
msg.ai8(0);
msg += str;
NetworkManager::getInstance()->getPeers()[0]->sendPacket(msg);

View File

@@ -60,7 +60,10 @@ public:
// ------------------------------------------------------------------------
/** Constructor to store one byte. */
NetworkString(const uint8_t& value) { m_string.push_back(value); }
NetworkString(int len)
{
m_string.reserve(len);
} // NetworkString(int)
// ------------------------------------------------------------------------
/** Copy constructor. */

View File

@@ -157,7 +157,7 @@ void ProtocolManager::notifyEvent(Event* event)
void ProtocolManager::sendMessage(Protocol* sender, const NetworkString& message,
bool reliable)
{
NetworkString newMessage;
NetworkString newMessage(1+message.size());
newMessage.ai8(sender->getProtocolType()); // add one byte to add protocol type
newMessage += message;
NetworkManager::getInstance()->sendPacket(newMessage, reliable);
@@ -167,7 +167,7 @@ void ProtocolManager::sendMessage(Protocol* sender, const NetworkString& message
void ProtocolManager::sendMessage(Protocol* sender, STKPeer* peer,
const NetworkString& message, bool reliable)
{
NetworkString newMessage;
NetworkString newMessage(1+message.size());
newMessage.ai8(sender->getProtocolType()); // add one byte to add protocol type
newMessage += message;
NetworkManager::getInstance()->sendPacket(peer, newMessage, reliable);
@@ -178,7 +178,7 @@ void ProtocolManager::sendMessageExcept(Protocol* sender, STKPeer* peer,
const NetworkString& message,
bool reliable)
{
NetworkString newMessage;
NetworkString newMessage(1+message.size());
newMessage.ai8(sender->getProtocolType()); // add one byte to add protocol type
newMessage += message;
NetworkManager::getInstance()->sendPacketExcept(peer, newMessage, reliable);

View File

@@ -54,7 +54,7 @@ void ClientLobbyRoomProtocol::setup()
void ClientLobbyRoomProtocol::requestKartSelection(std::string kart_name)
{
NetworkString request;
NetworkString request(6+1+kart_name.size());
// 0x02 : kart selection request, size_token (4), token, size kart name, kart name
request.ai8(0x02).ai8(4).ai32(m_server->getClientServerToken()).add(kart_name);
m_listener->sendMessage(this, request, true);
@@ -64,7 +64,7 @@ void ClientLobbyRoomProtocol::requestKartSelection(std::string kart_name)
void ClientLobbyRoomProtocol::voteMajor(uint8_t major)
{
NetworkString request;
NetworkString request(8);
// 0xc0 : major vote, size_token (4), token, size major(1),major
request.ai8(0xc0).ai8(4).ai32(m_server->getClientServerToken()).ai8(1).ai8(major);
m_listener->sendMessage(this, request, true);
@@ -74,7 +74,7 @@ void ClientLobbyRoomProtocol::voteMajor(uint8_t major)
void ClientLobbyRoomProtocol::voteRaceCount(uint8_t count)
{
NetworkString request;
NetworkString request(8);
// 0xc0 : race count vote, size_token (4), token, size race count(1), count
request.ai8(0xc1).ai8(4).ai32(m_server->getClientServerToken()).ai8(1).ai8(count);
m_listener->sendMessage(this, request, true);
@@ -84,7 +84,7 @@ void ClientLobbyRoomProtocol::voteRaceCount(uint8_t count)
void ClientLobbyRoomProtocol::voteMinor(uint8_t minor)
{
NetworkString request;
NetworkString request(8);
// 0xc0 : minor vote, size_token (4), token, size minor(1),minor
request.ai8(0xc2).ai8(4).ai32(m_server->getClientServerToken()).ai8(1).ai8(minor);
m_listener->sendMessage(this, request, true);
@@ -94,7 +94,7 @@ void ClientLobbyRoomProtocol::voteMinor(uint8_t minor)
void ClientLobbyRoomProtocol::voteTrack(std::string track, uint8_t track_nb)
{
NetworkString request;
NetworkString request(8+1+track.size());
// 0xc0 : major vote, size_token (4), token, size track, track, size #track, #track
request.ai8(0xc3).ai8(4).ai32(m_server->getClientServerToken()).add(track).ai8(1).ai8(track_nb);
m_listener->sendMessage(this, request, true);
@@ -104,7 +104,7 @@ void ClientLobbyRoomProtocol::voteTrack(std::string track, uint8_t track_nb)
void ClientLobbyRoomProtocol::voteReversed(bool reversed, uint8_t track_nb)
{
NetworkString request;
NetworkString request(9);
// 0xc0 : major vote, size_token (4), token, size reversed(1),reversed, size #track, #track
request.ai8(0xc4).ai8(4).ai32(m_server->getClientServerToken()).ai8(1).ai8(reversed).ai8(1).ai8(track_nb);
m_listener->sendMessage(this, request, true);
@@ -114,7 +114,7 @@ void ClientLobbyRoomProtocol::voteReversed(bool reversed, uint8_t track_nb)
void ClientLobbyRoomProtocol::voteLaps(uint8_t laps, uint8_t track_nb)
{
NetworkString request;
NetworkString request(10);
// 0xc0 : major vote, size_token (4), token, size laps(1),laps, size #track, #track
request.ai8(0xc5).ai8(4).ai32(m_server->getClientServerToken()).ai8(1).ai8(laps).ai8(1).ai8(track_nb);
m_listener->sendMessage(this, request, true);
@@ -231,7 +231,7 @@ void ClientLobbyRoomProtocol::update()
break;
case LINKED:
{
NetworkString ns;
NetworkString ns(6);
// 1 (connection request), 4 (size of id), global id
ns.ai8(1).ai8(4).ai32(PlayerManager::getCurrentOnlineId());
m_listener->sendMessage(this, ns);

View File

@@ -118,7 +118,7 @@ bool ControllerEventsProtocol::notifyEventAsynchronous(Event* event)
{
if (i == client_index) // don't send that message to the sender
continue;
NetworkString ns2;
NetworkString ns2(4+pure_message.size());
ns2.ai32(m_controllers[i].second->getClientServerToken());
ns2 += pure_message;
m_listener->sendMessage(this, m_controllers[i].second, ns2, false);
@@ -157,7 +157,7 @@ void ControllerEventsProtocol::controllerAction(Controller* controller,
uint8_t serialized_2 = (uint8_t)(controls->m_accel*255.0);
uint8_t serialized_3 = (uint8_t)(controls->m_steer*127.0);
NetworkString ns;
NetworkString ns(17);
ns.ai32(m_controllers[m_self_controller_index].second->getClientServerToken());
ns.af(World::getWorld()->getTime());
ns.ai8(m_self_controller_index);

View File

@@ -79,7 +79,7 @@ void GameEventsProtocol::collectedItem(Item* item, AbstractKart* kart)
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
for (unsigned int i = 0; i < peers.size(); i++)
{
NetworkString ns;
NetworkString ns(11);
ns.ai32(peers[i]->getClientServerToken());
// 0x01 : item picked : send item id, powerup type and kart race id
uint8_t powerup = 0;

View File

@@ -86,7 +86,7 @@ void GetPublicAddress::createStunRequest()
m_transaction_host->setupClient(1, 1, 0, 0);
// Assemble the message for the stun server
NetworkString s;
NetworkString s(21);
// bytes 0-1: the type of the message
// bytes 2-3: message length added to header (attributes)

View File

@@ -78,7 +78,7 @@ void KartUpdateProtocol::update()
time = current_time;
if (m_listener->isServer())
{
NetworkString ns;
NetworkString ns(4+m_karts.size()*32);
ns.af( World::getWorld()->getTime());
for (unsigned int i = 0; i < m_karts.size(); i++)
{
@@ -97,7 +97,7 @@ void KartUpdateProtocol::update()
AbstractKart* kart = m_karts[m_self_kart_index];
Vec3 v = kart->getXYZ();
btQuaternion quat = kart->getRotation();
NetworkString ns;
NetworkString ns(36);
ns.af( World::getWorld()->getTime());
ns.ai32( kart->getWorldKartId());
ns.af(v[0]).af(v[1]).af(v[2]); // add position

View File

@@ -150,7 +150,7 @@ void ServerLobbyRoomProtocol::startGame()
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
for (unsigned int i = 0; i < peers.size(); i++)
{
NetworkString ns;
NetworkString ns(6);
ns.ai8(0x04).ai8(4).ai32(peers[i]->getClientServerToken()); // start game
m_listener->sendMessage(this, peers[i], ns, true); // reliably
}
@@ -165,7 +165,7 @@ void ServerLobbyRoomProtocol::startSelection()
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
for (unsigned int i = 0; i < peers.size(); i++)
{
NetworkString ns;
NetworkString ns(6);
ns.ai8(0x05).ai8(4).ai32(peers[i]->getClientServerToken()); // start selection
m_listener->sendMessage(this, peers[i], ns, true); // reliably
}
@@ -256,7 +256,7 @@ void ServerLobbyRoomProtocol::checkRaceFinished()
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
NetworkString queue;
NetworkString queue(karts_results.size()*2);
for (unsigned int i = 0; i < karts_results.size(); i++)
{
queue.ai8(1).ai8(karts_results[i]); // kart pos = i+1
@@ -264,7 +264,7 @@ void ServerLobbyRoomProtocol::checkRaceFinished()
}
for (unsigned int i = 0; i < peers.size(); i++)
{
NetworkString ns;
NetworkString ns(6);
ns.ai8(0x06).ai8(4).ai32(peers[i]->getClientServerToken());
NetworkString total = ns + queue;
m_listener->sendMessage(this, peers[i], total, true);
@@ -311,7 +311,7 @@ void ServerLobbyRoomProtocol::kartDisconnected(Event* event)
STKPeer* peer = *(event->peer);
if (peer->getPlayerProfile() != NULL) // others knew him
{
NetworkString msg;
NetworkString msg(3);
msg.ai8(0x02).ai8(1).ai8(peer->getPlayerProfile()->race_id);
m_listener->sendMessage(this, msg);
Log::info("ServerLobbyRoomProtocol", "Player disconnected : id %d",
@@ -353,7 +353,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
// add the player to the game setup
m_next_id = m_setup->getPlayerCount();
// notify everybody that there is a new player
NetworkString message;
NetworkString message(8);
// new player (1) -- size of id -- id -- size of local id -- local id;
message.ai8(1).ai8(4).ai32(player_id).ai8(1).ai8(m_next_id);
m_listener->sendMessageExcept(this, peer, message);
@@ -366,12 +366,13 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
((token_generator.get(RAND_MAX)<<8) & 0xff) +
((token_generator.get(RAND_MAX) & 0xff)));
std::vector<NetworkPlayerProfile*> players = m_setup->getPlayers();
// send a message to the one that asked to connect
NetworkString message_ack;
// Size is overestimated, probably one player's data will not be sent
NetworkString message_ack(13+players.size()*7);
// connection success (129) -- size of token -- token
message_ack.ai8(0x81).ai8(1).ai8(m_next_id).ai8(4).ai32(token).ai8(4).ai32(player_id);
// add all players so that this user knows
std::vector<NetworkPlayerProfile*> players = m_setup->getPlayers();
for (unsigned int i = 0; i < players.size(); i++)
{
// do not duplicate the player into the message
@@ -392,7 +393,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
} // accept player
else // refuse the connection with code 0 (too much players)
{
NetworkString message;
NetworkString message(3);
message.ai8(0x80); // 128 means connection refused
message.ai8(1); // 1 bytes for the error code
message.ai8(0); // 0 = too much players
@@ -432,7 +433,7 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
// check if selection is possible
if (!m_selection_enabled)
{
NetworkString answer;
NetworkString answer(3);
answer.ai8(0x82).ai8(1).ai8(2); // selection still not started
m_listener->sendMessage(this, peer, answer);
return;
@@ -440,7 +441,7 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
// check if somebody picked that kart
if (!m_setup->isKartAvailable(kart_name))
{
NetworkString answer;
NetworkString answer(3);
answer.ai8(0x82).ai8(1).ai8(0); // kart is already taken
m_listener->sendMessage(this, peer, answer);
return;
@@ -448,13 +449,13 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
// check if this kart is authorized
if (!m_setup->isKartAllowed(kart_name))
{
NetworkString answer;
NetworkString answer(3);
answer.ai8(0x82).ai8(1).ai8(1); // kart is not authorized
m_listener->sendMessage(this, peer, answer);
return;
}
// send a kart update to everyone
NetworkString answer;
NetworkString answer(3+1+kart_name.size());
// kart update (3), 1, race id
answer.ai8(0x03).ai8(1).ai8(peer->getPlayerProfile()->race_id);
// kart name size, kart name
@@ -486,11 +487,11 @@ void ServerLobbyRoomProtocol::playerMajorVote(Event* event)
uint8_t player_id = peer->getPlayerProfile()->race_id;
m_setup->getRaceConfig()->setPlayerMajorVote(player_id, data[6]);
// Send the vote to everybody (including the sender)
NetworkString other;
other.ai8(1).ai8(player_id); // add the player id
data.removeFront(5); // remove the token
NetworkString other(2+data.size());
other.ai8(1).ai8(player_id); // add the player id
other += data; // add the data
NetworkString prefix;
NetworkString prefix(1);
prefix.ai8(0xc0); // prefix the token with the ype
sendMessageToPeersChangingToken(prefix, other);
}
@@ -517,11 +518,11 @@ void ServerLobbyRoomProtocol::playerRaceCountVote(Event* event)
uint8_t player_id = peer->getPlayerProfile()->race_id;
m_setup->getRaceConfig()->setPlayerRaceCountVote(player_id, data[6]);
// Send the vote to everybody (including the sender)
NetworkString other;
other.ai8(1).ai8(player_id); // add the player id
data.removeFront(5); // remove the token
NetworkString other(2+data.size());
other.ai8(1).ai8(player_id); // add the player id
other += data; // add the data
NetworkString prefix;
NetworkString prefix(1);
prefix.ai8(0xc1); // prefix the token with the type
sendMessageToPeersChangingToken(prefix, other);
}
@@ -548,11 +549,11 @@ void ServerLobbyRoomProtocol::playerMinorVote(Event* event)
uint8_t player_id = peer->getPlayerProfile()->race_id;
m_setup->getRaceConfig()->setPlayerMinorVote(player_id, data[6]);
// Send the vote to everybody (including the sender)
NetworkString other;
other.ai8(1).ai8(player_id); // add the player id
data.removeFront(5); // remove the token
NetworkString other(2+data.size());
other.ai8(1).ai8(player_id); // add the player id
other += data; // add the data
NetworkString prefix;
NetworkString prefix(1);
prefix.ai8(0xc2); // prefix the token with the ype
sendMessageToPeersChangingToken(prefix, other);
}
@@ -581,11 +582,11 @@ void ServerLobbyRoomProtocol::playerTrackVote(Event* event)
uint8_t player_id = peer->getPlayerProfile()->race_id;
m_setup->getRaceConfig()->setPlayerTrackVote(player_id, track_name, data[N+7]);
// Send the vote to everybody (including the sender)
NetworkString other;
other.ai8(1).ai8(player_id); // add the player id
data.removeFront(5); // remove the token
NetworkString other(2+data.size());
other.ai8(1).ai8(player_id); // add the player id
other += data; // add the data
NetworkString prefix;
NetworkString prefix(1);
prefix.ai8(0xc3); // prefix the token with the ype
sendMessageToPeersChangingToken(prefix, other);
}
@@ -614,11 +615,11 @@ void ServerLobbyRoomProtocol::playerReversedVote(Event* event)
uint8_t player_id = peer->getPlayerProfile()->race_id;
m_setup->getRaceConfig()->setPlayerReversedVote(player_id, data[6]!=0, data[8]);
// Send the vote to everybody (including the sender)
NetworkString other;
other.ai8(1).ai8(player_id); // add the player id
data.removeFront(5); // remove the token
NetworkString other(2+data.size());
other.ai8(1).ai8(player_id); // add the player id
other += data; // add the data
NetworkString prefix;
NetworkString prefix(1);
prefix.ai8(0xc4); // prefix the token with the ype
sendMessageToPeersChangingToken(prefix, other);
}
@@ -647,11 +648,11 @@ void ServerLobbyRoomProtocol::playerLapsVote(Event* event)
uint8_t player_id = peer->getPlayerProfile()->race_id;
m_setup->getRaceConfig()->setPlayerLapsVote(player_id, data[6], data[8]);
// Send the vote to everybody (including the sender)
NetworkString other;
other.ai8(1).ai8(player_id); // add the player id
data.removeFront(5); // remove the token
NetworkString other(2+data.size());
other.ai8(1).ai8(player_id); // add the player id
other += data; // add the data
NetworkString prefix;
NetworkString prefix(1);
prefix.ai8(0xc5); // prefix the token with the ype
sendMessageToPeersChangingToken(prefix, other);
}

View File

@@ -198,7 +198,7 @@ void StartGameProtocol::ready() // on clients, means the loading is finished
if (!m_listener->isServer()) // if we're a client
{
assert(NetworkManager::getInstance()->getPeerCount() == 1);
NetworkString ns;
NetworkString ns(5);
ns.ai32(NetworkManager::getInstance()->getPeers()[0]->getClientServerToken()).ai8(1);
Log::info("StartGameProtocol", "Player ready, notifying server.");
m_listener->sendMessage(this, ns, true);

View File

@@ -74,7 +74,7 @@ bool SynchronizationProtocol::notifyEventAsynchronous(Event* event)
if (request)
{
NetworkString response;
NetworkString response(10);
response.ai8(data.gui8(talk_id)).ai32(token).ai8(0).ai32(sequence);
m_listener->sendMessage(this, peers[peer_id], response, false);
Log::verbose("SynchronizationProtocol", "Answering sequence %u", sequence);
@@ -155,7 +155,7 @@ void SynchronizationProtocol::asynchronousUpdate()
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
for (unsigned int i = 0; i < peers.size(); i++)
{
NetworkString ns;
NetworkString ns(10);
ns.ai8(i).addUInt32(peers[i]->getClientServerToken()).addUInt8(1).addUInt32(m_pings[i].size());
// now add the countdown if necessary
if (m_countdown_activated && m_listener->isServer())