Skip to content

Commit 46684be

Browse files
committedMay 18, 2015
Record MapBlock modification reasons as flags instead of strings
This improves performance of MapBlock::raiseModified by a factor of 6. Also, clean up mapblock.h a bit and inline small functions.
1 parent 4c9a8a9 commit 46684be

File tree

6 files changed

+286
-233
lines changed

6 files changed

+286
-233
lines changed
 

Diff for: ‎src/environment.cpp

+11-14
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,7 @@ void ServerEnvironment::clearAllObjects()
873873
if(block){
874874
block->m_static_objects.remove(id);
875875
block->raiseModified(MOD_STATE_WRITE_NEEDED,
876-
"clearAllObjects");
876+
MOD_REASON_CLEAR_ALL_OBJECTS);
877877
obj->m_static_exists = false;
878878
}
879879
}
@@ -952,7 +952,7 @@ void ServerEnvironment::clearAllObjects()
952952
block->m_static_objects.m_stored.clear();
953953
block->m_static_objects.m_active.clear();
954954
block->raiseModified(MOD_STATE_WRITE_NEEDED,
955-
"clearAllObjects");
955+
MOD_REASON_CLEAR_ALL_OBJECTS);
956956
num_objs_cleared += num_stored + num_active;
957957
num_blocks_cleared++;
958958
}
@@ -1139,7 +1139,7 @@ void ServerEnvironment::step(float dtime)
11391139
// set block to be saved when it is unloaded
11401140
if(block->getTimestamp() > block->getDiskTimestamp() + 60)
11411141
block->raiseModified(MOD_STATE_WRITE_AT_UNLOAD,
1142-
"Timestamp older than 60s (step)");
1142+
MOD_REASON_BLOCK_EXPIRED);
11431143

11441144
// Run node timers
11451145
std::map<v3s16, NodeTimer> elapsed_timers =
@@ -1530,7 +1530,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
15301530

15311531
if(set_changed)
15321532
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1533-
"addActiveObjectRaw");
1533+
MOD_REASON_ADD_ACTIVE_OBJECT_RAW);
15341534
} else {
15351535
v3s16 p = floatToInt(objectpos, BS);
15361536
errorstream<<"ServerEnvironment::addActiveObjectRaw(): "
@@ -1579,7 +1579,7 @@ void ServerEnvironment::removeRemovedObjects()
15791579
if (block) {
15801580
block->m_static_objects.remove(id);
15811581
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1582-
"removeRemovedObjects/remove");
1582+
MOD_REASON_REMOVE_OBJECTS_REMOVE);
15831583
obj->m_static_exists = false;
15841584
} else {
15851585
infostream<<"Failed to emerge block from which an object to "
@@ -1604,7 +1604,7 @@ void ServerEnvironment::removeRemovedObjects()
16041604
block->m_static_objects.m_stored.push_back(i->second);
16051605
block->m_static_objects.m_active.erase(id);
16061606
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1607-
"removeRemovedObjects/deactivate");
1607+
MOD_REASON_REMOVE_OBJECTS_DEACTIVATE);
16081608
}
16091609
} else {
16101610
infostream<<"Failed to emerge block from which an object to "
@@ -1690,8 +1690,7 @@ void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
16901690
// Clear stored list
16911691
block->m_static_objects.m_stored.clear();
16921692
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1693-
"stored list cleared in activateObjects due to "
1694-
"large amount of objects");
1693+
MOD_REASON_TOO_MANY_OBJECTS);
16951694
return;
16961695
}
16971696

@@ -1812,7 +1811,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
18121811
block->m_static_objects.insert(id, s_obj);
18131812
obj->m_static_block = blockpos_o;
18141813
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1815-
"deactivateFarObjects: Static data moved in");
1814+
MOD_REASON_STATIC_DATA_ADDED);
18161815

18171816
// Delete from block where object was located
18181817
block = m_map->emergeBlock(old_static_block, false);
@@ -1825,7 +1824,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
18251824
}
18261825
block->m_static_objects.remove(id);
18271826
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1828-
"deactivateFarObjects: Static data moved out");
1827+
MOD_REASON_STATIC_DATA_REMOVED);
18291828
continue;
18301829
}
18311830

@@ -1890,8 +1889,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
18901889
// Only mark block as modified if data changed considerably
18911890
if(shall_be_written)
18921891
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1893-
"deactivateFarObjects: Static data "
1894-
"changed considerably");
1892+
MOD_REASON_STATIC_DATA_CHANGED);
18951893
}
18961894
}
18971895

@@ -1937,8 +1935,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
19371935
// Only mark block as modified if data changed considerably
19381936
if(shall_be_written)
19391937
block->raiseModified(MOD_STATE_WRITE_NEEDED,
1940-
"deactivateFarObjects: Static data "
1941-
"changed considerably");
1938+
MOD_REASON_STATIC_DATA_CHANGED);
19421939

19431940
obj->m_static_exists = true;
19441941
obj->m_static_block = block->getPos();

Diff for: ‎src/map.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,7 @@ void Map::timerUpdate(float dtime, float unload_timeout,
14361436

14371437
// Save if modified
14381438
if (block->getModified() != MOD_STATE_CLEAN && save_before_unloading) {
1439-
modprofiler.add(block->getModifiedReason(), 1);
1439+
modprofiler.add(block->getModifiedReasonString(), 1);
14401440
if (!saveBlock(block))
14411441
continue;
14421442
saved_blocks_count++;
@@ -2412,7 +2412,7 @@ void ServerMap::finishBlockMake(BlockMakeData *data,
24122412
Set block as modified
24132413
*/
24142414
block->raiseModified(MOD_STATE_WRITE_NEEDED,
2415-
"finishBlockMake expireDayNightDiff");
2415+
MOD_REASON_EXPIRE_DAYNIGHTDIFF);
24162416
}
24172417

24182418
/*
@@ -2981,7 +2981,7 @@ void ServerMap::save(ModifiedState save_level)
29812981
save_started = true;
29822982
}
29832983

2984-
modprofiler.add(block->getModifiedReason(), 1);
2984+
modprofiler.add(block->getModifiedReasonString(), 1);
29852985

29862986
saveBlock(block);
29872987
block_count++;

Diff for: ‎src/mapblock.cpp

+46-2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,30 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3838

3939
#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
4040

41+
static const char *modified_reason_strings[] = {
42+
"initial",
43+
"reallocate",
44+
"setIsUnderground",
45+
"setLightingExpired",
46+
"setGenerated",
47+
"setNode",
48+
"setNodeNoCheck",
49+
"setTimestamp",
50+
"NodeMetaRef::reportMetadataChange",
51+
"clearAllObjects",
52+
"Timestamp expired (step)",
53+
"addActiveObjectRaw",
54+
"removeRemovedObjects/remove",
55+
"removeRemovedObjects/deactivate",
56+
"Stored list cleared in activateObjects due to overflow",
57+
"deactivateFarObjects: Static data moved in",
58+
"deactivateFarObjects: Static data moved out",
59+
"deactivateFarObjects: Static data changed considerably",
60+
"finishBlockMake: expireDayNightDiff"
61+
"unknown",
62+
};
63+
64+
4165
/*
4266
MapBlock
4367
*/
@@ -47,8 +71,7 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
4771
m_pos(pos),
4872
m_gamedef(gamedef),
4973
m_modified(MOD_STATE_WRITE_NEEDED),
50-
m_modified_reason("initial"),
51-
m_modified_reason_too_long(false),
74+
m_modified_reason(MOD_REASON_INITIAL),
5275
is_underground(false),
5376
m_lighting_expired(true),
5477
m_day_night_differs(false),
@@ -112,6 +135,27 @@ MapNode MapBlock::getNodeParent(v3s16 p, bool *is_valid_position)
112135
return data[p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X];
113136
}
114137

138+
std::string MapBlock::getModifiedReasonString()
139+
{
140+
std::string reason;
141+
142+
const u32 ubound = MYMIN(sizeof(m_modified_reason) * CHAR_BIT,
143+
ARRLEN(modified_reason_strings));
144+
145+
for (u32 i = 0; i != ubound; i++) {
146+
if ((m_modified_reason & (1 << i)) == 0)
147+
continue;
148+
149+
reason += modified_reason_strings[i];
150+
reason += ", ";
151+
}
152+
153+
if (reason.length() > 2)
154+
reason.resize(reason.length() - 2);
155+
156+
return reason;
157+
}
158+
115159
/*
116160
Propagates sunlight down through the block.
117161
Doesn't modify nodes that are not affected by sunlight.

0 commit comments

Comments
 (0)
Please sign in to comment.