【问题标题】:Nested iteration within the same multimap同一个多图中的嵌套迭代
【发布时间】:2011-12-27 14:27:36
【问题描述】:

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

这是确切的代码:

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;

【问题讨论】:

    标签: c++ nested iteration multimap


    【解决方案1】:

    碰撞检测旨在最大限度地减少您必须执行的检查次数。例如,您应该将每个演员与其他演员进行比较,除非您的演员很少。这是一个 O(N^2) 算法,在添加演员时不能很好地扩展(双倍数字需要四倍的时间)。也许你知道每个演员的大小?然后您可以尝试与此范围内的演员发生碰撞。有一个名为ANN 的库可以用来非常快速地找到最近的邻居。

    祝你好运!

    【讨论】:

    • 感谢 chac 链接现已修复。
    【解决方案2】:

    你的算法基本上是对象数量的二次方,所以难怪随着对象数量的增加它会变慢。

    我会应用某种分割:您可以根据对象的位置将对象拆分为不同的列表,这样只有相同或相邻列表的对象才能发生碰撞。这样您的比较次数就会减少。

    另一个流行的优化是只检查自上次检查以来移动的对象,这可能(或可能不)排除大量静态对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-16
      • 2020-07-09
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多