【问题标题】:Polymorphism in game游戏中的多态性
【发布时间】:2014-10-15 21:37:34
【问题描述】:

我正在使用 C++ 制作游戏,并且正在考虑是否使用多态性。 我知道在大多数情况下使用多态会更好,但问题是我在游戏中制作了一些粒子效果,并且一秒钟内会弹出数百个。如果我在这种情况下使用多态,我会频繁分配和释放内存,这肯定会减慢游戏速度。

那么,即使必须频繁地新建/删除对象,我是否应该使用多态性?

顺便说一句,如果我的语法坏了,请纠正我。我还在学习英语。

【问题讨论】:

  • 你为什么说“如果我使用多态......我会经常分配和释放内存”。多态性意味着你有一个类的层次结构,其中一些虚拟被覆盖。你必须做的新和删除的数量并不取决于你的设计有多态。所以,首先要做的事情是:你的粒子是否都基本相同,或者它们是否具有类型层次结构?如果是后者,是否存在所有粒子都以不同方式执行的功能?
  • 粒子效果通常使用某种对象池来减少分配。此外,您不必对所有内容都使用多态性。
  • 我没有表达清楚。我认为我的问题实际上是关于新/删除的性能。通常这不是问题,但在游戏中,一秒钟内会创建数百或数千个。因此,如果经常新建/删除对性能很重要,我宁愿使用粒子池。如果没有,那么我想我会使用多态性。
  • 我很好奇。可以使用指针吗?他们会更快吗?

标签: c++ performance polymorphism


【解决方案1】:

如果您不使用多态性,您仍然需要相同数量的 new/delete 来创建所有粒子。多态性不会显着降低您的性能。它只会导致一些间接函数调用,而不是直接调用。这是几乎所有现代 CPU 的指令集都支持的东西。

因此,如果多态性很好地解决了您的游戏设计问题,那就去做吧。

回到您最初创建/删除大量类似对象(如粒子)的问题,您可以考虑使用flyweight 设计模式,它“使用共享来有效地支持大量细粒度对象”(设计模式、Gamma 等)

【讨论】:

  • 多态性的问题在于可以容纳任何派生类型的数据结构。你不能再使用vector<T>,但必须使用某种指针,这就引发了它们指向哪里的问题。
  • 是的,多态需要指针;这真的是个问题吗?另一方面,如果您使用vector<T> 创建和删除粒子,您将在头顶移动元素。另一种选择是使用指向存储池元素的指针向量(为避免分配,每个对象类型一个池)。但是如果没有看到 OP 所说的代码,很难给出具体的建议。
【解决方案2】:

我认为使用多态这一简单事实对性能本身没有影响或影响很小,这完全取决于您如何设计游戏。

所以我的建议是:

  1. 先做一些测试,模拟一些你可以在游戏中做的事情,看看性能如何,可以接受吗?如果是这样,请不要优化!
  2. 如果性能还不错,那就追求可维护性吧!一开始不要害怕使用语言资源,写代码的时候会更容易维护代码,不要做Premature Optimization
  3. 如果您遇到性能问题,请尝试找出瓶颈并进行修复。如果您认为问题是因为分配和释放内存的频率,请尝试另一种方法,例如制作某种粒子缓冲区,使粒子呈现一些无效状态并在您再次需要时重新使用它们,避免释放和分配内存经常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 2011-04-13
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多