我正在尝试对游戏对象进行碰撞检查。我有一个多图,每个键中包含相同类型的对象。键代表对象的类型。但是,所有类型都源自同一类。我需要将它们分开,以便对象知道当一种类型的对象触摸另一种类型的对象时该怎么做。但是似乎我检查碰撞的方式非常慢,因为我注意到添加的对象越多,它们移动的速度就越慢。谁能帮我? :(

这是确切的代码:

void CheckCollisions()
{
    if (!Actors.empty())
    {
        std::multimap<std::string, boost::shared_ptr<std::vector<PActor>>>::const_iterator it;
        it = Actors.begin();
        while (it != Actors.end())
        {
            for (int i = 0; i < static_cast<int>(it->second->size()); i++)
            {
                std::multimap<std::string, boost::shared_ptr<std::vector<PActor>>>::const_iterator it2;
                it2 = Actors.begin();
                while(it2 != Actors.end())
                {
                    for (int j = 0; j < static_cast<int>(it2->second->size()); j++)
                    {
                        if (i != j)
                        {
                            if (Touch(it->second->at(i), it2->second->at(j)))
                            {
                                it->second->at(i)->Touch(it2->first, it2->second->at(j));
                                it2->second->at(j)->Touch(it->first, it->second->at(i));
                            }
                        }
                    }
                    it2++;
                }
            }
            it++;
        }
    }
}


注意:
PActor只是Actor的shared_ptr;

最佳答案

冲突检测就是将您要做的检查数量减到最少。例如,除非您的演员很少,否则您不应将每个演员与其他演员进行比对。这是一个O(N ^ 2)算法,无法在添加actor时很好地扩展(两倍的数字需要四倍的时间)。也许您知道每个演员的人数?然后,您可以尝试与该范围内的actor碰撞。有一个名为ANN的库,可用于快速查找最近的邻居。

祝好运!

关于c++ - 同一 multimap 内的嵌套迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8645708/

10-15 06:39