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?
Answer
Instead of making full copies of every entity in the world, just save the entities and attributes that are relevant to what you want to lag compensate.
For example, in a first person shooter, often the only thing to lag compensate are the bullet shots. To calculate whether a bullet hit, you only need to know, (a) the positions of other players and, (b) their hit boxes. That's all you should store in the history buffer. When you need to lag compensate, update the positions and hit boxes of the players, without touching anything else.
Additionally, you can be intelligent about which entities you choose to lag compensate. If you know your skill has a maximum range of x
and players can move at a maximum speed of y
then don't bother lag compensating any entities farther than x+y*dt
distance away, since you know that they won't be hit by the skill.
P.S. I'm also working on an MMO that uses lag compensation. Just because it's not expected by MMO players doesn't mean we should deny them a good experience! WoW is over 7 years old now.
No comments:
Post a Comment