【问题标题】:Faster to create map of pointers or if statement更快地创建指针映射或 if 语句
【发布时间】:2014-08-27 08:50:52
【问题描述】:

我正在使用 C++ 和 SFML 创建游戏引擎。我有一个名为character 的类,它将成为游戏中实体的基础。 physics 类也将处理角色移动。

我的问题是,创建一个指向在帧中移动的字符的指针向量是否更快。然后,每当一个函数移动一个字符时,它就会把它放在那个向量中。在physics 类处理完向量后,它会被清除吗?

或者,当函数移动character 时将bool 变量设置为true,然后在我的physics 类中使用if 语句来测试每个character 的移动是否更快?

编辑: 好的,我采用了另一种方法,其中Physics 类中的函数负责处理角色移动。在移动时,它会立即测试碰撞检测。如果发生碰撞,它会停止该方向的运动。

感谢大家的帮助

【问题讨论】:

  • 如果你能检测到它,只存储指向移动字符的指针而不是(甚至位向量)检查每个移动的字符会更快。也取决于接下来会发生什么。
  • 每个必须处理字符移动的函数,在移动一个字符时,都会在向量中放置一个指向它的指针。这是你的意思吗?
  • 为什么每个角色都需要一个 bool 函数?
  • 布尔值告诉物理课,是的,这个角色已经被移动了。然后物理课通过并测试所述运动的碰撞,如果不可能,则取消运动。

标签: c++ if-statement vector sfml


【解决方案1】:

与您程序中发生的所有其他内容(物理、图形)相比,这不会有什么不同。使用使编程更容易的方法,因为您根本不会注意到运行时差异。

【讨论】:

  • 绝对。关键是要防止不必要的物理引擎调用,因为这就是 CPU 消耗发生的地方。
【解决方案2】:

如果字符总数相对较少,那么您将不会注意到这些方法之间的差异。

否则(字符数很大),如果大多数字符在一帧中移动,那么在字符内使用标志的方法似乎更合适,因为即使使用移动字符的向量,您也会遍历所有字符并除此之外,您还会获得额外的维护向量的开销。

否则(字符数量很大,但在一帧中只有少数字符移动),可能最好使用矢量,因为它可以通过不遍历未遍历的字符来节省时间'动不动。

什么是小数或大数,取决于您的应用程序。您应该测试在哪些条件下使用任何一种方法可以获得更好的性能。

【讨论】:

  • 如果有大量字符,物理引擎很可能会比用于选择其调用的任何方法消耗更多的 CPU。尝试优化此选择是浪费时间,这可能会导致不必要的混淆代码以获得可忽略的收益,恕我直言。
  • @kuroineko 你可以想象一下有 100 万个字符而只有 10 个移动的情况,遍历它们可能会有明显的开销。
  • @kuroi 它确实表明存在设计缺陷。我还是不明白为什么你需要关心一个角色是否移动了。
  • @AntonSavin 好吧,如果游戏中有大量对象,您将没有足够的内存来处理它们...
【解决方案3】:

现在是引用 Hoare 的合适时机,但我会弃权。但是,通常情况下,您应该在优化之前进行分析(当且仅当在最低规格硬件上的时间预算不够时 - 如果您的游戏在目标硬件上以 60fps 运行,您将什么都不做 em>)。
实际的物理计算更有可能成为限制因素,而不是“这个单元在移动吗?”查看。此外,提交绘图调用更有可能会咬你而不是检查几百个左右的单位。

作为“显而易见”的事情,持有对象指针向量并仅处理实际移动的单元似乎更快。然而,“显而易见”并不总是正确的。对大量元素进行线性迭代可能比四处跳转更快(由于缓存)。同样,如果您的游戏的这部分被确定为瓶颈(非常不可能),那么您将必须衡量哪个更好。

【讨论】:

  • 这只是我更好奇的事情,但感谢您的良好反应。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2015-05-28
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多