I'm writing small MMO using Boost library. I want to make it non-target game, but I'm having trouble saving the previous game state. I don't know how to implement the game world, NPCs', and players' states. Currently, I'm copying all my NPCs, players and map in main game cycle, but it consumes too much CPU usage, about 60-80%. Obviously it too much.
Example of code in my save game method:
void GameHistory::saveGame(game* g)
{
if (player_history.size() == 64) {
player_history.erase(player_history.begin());
}
if (map_history.size() == 64) {
map_history.erase(map_history.begin());
}
if (npc_history.size() == 64) {
npc_history.erase(npc_history.begin());
}
long long t = lib::GET_SERVER_TIME();
players_obj_hash players;
game::players_hash::iterator itp = g->__players_by_id__.begin();
game::players_hash::iterator endp = g->__players_by_id__.end();
for (; itp != endp; itp++) {
players[itp->second->getId()] = (*itp->second);
}
player_history[t] = players;
map_history[t] = g->map;
npcs_obj_hash npcs;
game::npc_hash::iterator it = g->npcs_by_id.begin();
game::npc_hash::iterator end = g->npcs_by_id.end();
for (; it != end; it++) {
npcs[it->second->getId()] = (*it->second);
}
npc_history[t] = npcs;
}
I'm using map as grid, where every NPC or player "register" on which cell it's on for fast lookup of nearest entities.
Maybe there is another more light approach to save the game state?