在我的自定义物理引擎中,最大的瓶颈是从空间分区(2D 网格)中获取所有物体的方法,并返回一个只包含指向 body 的唯一指针的集合。
template<typename T, typename V> bool contains(const T& mContainer, const V& mValue)
{
return std::find(std::begin(mContainer),
std::end(mContainer), mValue) != std::end(mContainer);
}
const vector<Body*>& GridInfo::getBodiesToCheck()
{
bodiesToCheck.clear();
for(auto& query : queries)
for(auto& body : *query)
if(!contains(bodiesToCheck, body)) bodiesToCheck.push_back(body);
return bodiesToCheck;
}
使用分析器表明瓶颈在于“包含”方法。
显然, anstd::unordered_set
将是这里的“理想”解决方案。但是,它比当前的解决方案慢很多。我也试过google::dense_hash_set
,它比 快std::unordered_set
,但仍然比当前的解决方案慢。
const unordered_set<Body*>& GridInfo::getBodiesToCheck()
{
bodiesToCheck.clear();
for(auto& query : queries)
for(auto& body : *query)
/*if(!contains(bodiesToCheck, body))*/ bodiesToCheck.insert(body);
return bodiesToCheck;
}
为什么“正确”的容器比 a 慢std::vector
?
有什么办法可以进一步加快这种方法的速度吗?