【问题标题】:Container for deletion from any place by value with fast iterations通过快速迭代从任何地方按值删除的容器
【发布时间】:2012-03-29 09:18:10
【问题描述】:

我正在尝试制作塔防游戏,我正在实现游戏地图以在精确半径内快速查找实体。我使它与 std::list 一起工作(用于快速 push_back 实体指针,并且从列表的任何点删除都不错),但我发现迭代列表的 1500 个元素是超长的。我的游戏连 10 FPS 都达不到。我将展示 MSVS 在分析器中显示的内容:

在 getEntitiesInRadius 调用之后,下一个是 != 运算符,用于与列表末尾进行比较。接下来是 == 运算符调用。它在调试模式下运行。但我认为即使是调试迭代 1500 个元素也太长了。也许我对这个断言有误?

【问题讨论】:

  • 迭代列表很慢。尝试更改为 std::vector。删除速度较慢,但​​ push_back (摊销)快且迭代速度快。
  • 我觉得Debug模式下测试性能没有意义
  • +1 用于编写塔防游戏。我爱他们,他们是不够的。 :-)
  • @psur:启用调试符号(其开销几乎为零)与“调试模式”(您可以在其中进行边界检查等)不同。事实上,为了进行分析,同时启用调试符号和优化是很常见的。
  • 你可以试试std::deque,它本质上是一个向量列表。它结合了向量的低级效率和列表的灵活性。

标签: c++ performance stl linked-list containers


【解决方案1】:

我会假设你的地图在整个游戏中都是固定大小的?如果您想要“最快”,std::list 根本不是一个好的选择,我会从vector 开始,只有当这还不够时,我才会考虑其他解决方案。

您说您将 list 用于“快速 push_back”,但除非正在调整向量的大小(可以通过使用 reserve 来避免,当然在固定大小的实体上(就像游戏地图那样)),push_back 在矢量会快很多。 删除可能会更慢(但没有给出)。

最重要的是,在调试版本上进行性能测试根本没有意义,在尝试解决之前先确保有问题!

【讨论】:

  • 我在发布模式下构建它 /O2 具有 1500 个实体的性能很好。只有大约 4-5% 的 CPU 使用率。感谢您的快速解答!
猜你喜欢
  • 2014-10-29
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2020-06-22
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多