Speedup getBlockNodeIdMapping by up to factor 4 by using a fixed size mapping array
parent
2625323f25
commit
5d06bdf8ac
|
@ -452,10 +452,16 @@ s16 MapBlock::getGroundLevel(v2s16 p2d)
|
||||||
*/
|
*/
|
||||||
// List relevant id-name pairs for ids in the block using nodedef
|
// List relevant id-name pairs for ids in the block using nodedef
|
||||||
// Renumbers the content IDs (starting at 0 and incrementing
|
// Renumbers the content IDs (starting at 0 and incrementing
|
||||||
|
// use static memory requires about 65535 * sizeof(int) ram in order to be
|
||||||
|
// sure we can handle all content ids. But it's absolutely worth it as it's
|
||||||
|
// a speedup of 4 for one of the major time consuming functions on storing
|
||||||
|
// mapblocks.
|
||||||
|
static content_t getBlockNodeIdMapping_mapping[USHRT_MAX];
|
||||||
static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
|
static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
|
||||||
INodeDefManager *nodedef)
|
INodeDefManager *nodedef)
|
||||||
{
|
{
|
||||||
std::map<content_t, content_t> mapping;
|
memset(getBlockNodeIdMapping_mapping, 0xFF, USHRT_MAX * sizeof(content_t));
|
||||||
|
|
||||||
std::set<content_t> unknown_contents;
|
std::set<content_t> unknown_contents;
|
||||||
content_t id_counter = 0;
|
content_t id_counter = 0;
|
||||||
for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
|
for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
|
||||||
|
@ -464,16 +470,14 @@ static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
|
||||||
content_t id = CONTENT_IGNORE;
|
content_t id = CONTENT_IGNORE;
|
||||||
|
|
||||||
// Try to find an existing mapping
|
// Try to find an existing mapping
|
||||||
std::map<content_t, content_t>::iterator j = mapping.find(global_id);
|
if (getBlockNodeIdMapping_mapping[global_id] != 0xFFFF) {
|
||||||
if(j != mapping.end())
|
id = getBlockNodeIdMapping_mapping[global_id];
|
||||||
{
|
|
||||||
id = j->second;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We have to assign a new mapping
|
// We have to assign a new mapping
|
||||||
id = id_counter++;
|
id = id_counter++;
|
||||||
mapping.insert(std::make_pair(global_id, id));
|
getBlockNodeIdMapping_mapping[global_id] = id;
|
||||||
|
|
||||||
const ContentFeatures &f = nodedef->get(global_id);
|
const ContentFeatures &f = nodedef->get(global_id);
|
||||||
const std::string &name = f.name;
|
const std::string &name = f.name;
|
||||||
|
|
Loading…
Reference in New Issue