在我的游戏中,我使用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,这段代码也会将性能降低到零。如何改善位置更新性能以找到最近的实体?
答案 0 :(得分:0)
每次移动时插入或移除集合都是一种可以立即阻止程序性能的方法。
将你的世界分成一个网格,并在任何一个点保持对哪个字符是网格特定方格的引用。当您想要找到与另一个实体接近的实体时,您可以围绕相关实体的中心定义一个圆,检查哪个方块与此圆重叠,并且只检查落在这4个方格内的实体以确定哪个在圆内