Kd Tree c ++擦除并插入慢速性能

时间:2012-03-18 13:08:29

标签: c++ performance optimization

在我的游戏中,我使用libkdtree ++。我的方法是在npc或播放器的每一个动作中,将其从树中删除并插入新位置。像这样:

void Map::updateEntityPos(Entity& e)
{
    map_lock.lock();
    map_duplet.set_data(e.getLastPos(), &e);
    entity_tree->erase_exact(map_duplet);
    entity_tree->optimise();
    map_duplet.set_data(e.getPos(), &e);
    entity_tree->insert(map_duplet);
    entity_tree->optimise();
    map_lock.unlock();
}

但是我发现即使有100个npc,这段代码也会将性能降低到零。如何改善位置更新性能以找到最近的实体?

1 个答案:

答案 0 :(得分:0)

每次移动时插入或移除集合都是一种可以立即阻止程序性能的方法。

将你的世界分成一个网格,并在任何一个点保持对哪个字符是网格特定方格的引用。当您想要找到与另一个实体接近的实体时,您可以围绕相关实体的中心定义一个圆,检查哪个方块与此圆重叠,并且只检查落在这4个方格内的实体以确定哪个在圆内