Reserve space for NetworkStrings (to reduce copying when reallocating).
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user