性能的“家酿”STL?

时间:2009-03-26 16:25:51

标签: stl

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

根据那篇文章,STL不适合游戏开发。 你对此有何看法?

我目前的做法是: 使用STL,如果导致性能问题与homebrew容器(或分配器)交换(还没有来,但我没有做高端的3D游戏;)

8 个答案:

答案 0 :(得分:10)

在这种情况下,您的方法是唯一合理的选择。优化的规则#1是“除非你确切知道瓶颈在哪里,否则不要进行优化”。

您应该仍然可以在以后相对容易地交换容器,特别是如果您使用通过typedef定义的类型而不是直接使用STL容器。我的意思是:

#include <vector>

typedef std::vector<int> MyIntVectorType;

int main()
{
   MyIntVectorType theVector; 
}

答案 1 :(得分:6)

你必须知道STL在幕后做了什么。例如,如果您使用向量,例如,不要让它任意增长,请使用vector :: resize()预先进行分配,这样它只分配一次。类似的东西。你的方法并不差 - 只需做好功课。

答案 2 :(得分:2)

如果您刚开始使用游戏编程,请继续使用STL,这很棒且稳定。你最好使用一些有效且稳定的东西,而不是开始刮擦fps或两个。然而,以下是许多主要工作室不使用它的两个原因。

  • 在某些时候,您需要将系统推向极限。如果您的引擎非常大,优化容器是获得各地(图形,音频,物理等)的好方法。通过组装进行优化,具有不同用途的容器的不同实现将成为必须。模板并不是最糟糕的实现。
  • STL在不同的平台上有不同的实现方式(PS2,PS3,Wii,360,PC等)。如果您正在进行跨平台工作,有时这些差异将在系统的根部产生问题,即所谓的“全平台代码”。当你遇到这种情况时,你会希望转移到能够以更简单的方式维护的东西。

拥有容器的自定义版本并不是一项微不足道的工作,只有在值得的时候才能这样做。

答案 3 :(得分:1)

使用STL,如果它在可接受的性能范围内工作,请保留它。如果没有,请尝试别的。在尝试现有实现之前,您不希望重写已存在的内容。

答案 4 :(得分:1)

C ++中许多与执行相关的问题已在C++0x中得到修复。

答案 5 :(得分:1)

您可能希望查看专为游戏设计的EASTL内容。

编辑:道歉,我认为问题中的链接是另一篇文章。

答案 6 :(得分:1)

有时它不是需要替换的容器,而是包含的对象。我曾经有一个大的std :: map,它有一个键的字符串,而且太慢了。我意识到我的所有键都是相同的大小,所以我用一个专门的版本替换了字符串类,我把它作为一个固定大小的char缓冲区的包装器,并且性能不再是问题。

知道你的瓶颈在哪里,并且不要以为你可以编写任何更快的版本,除非你可以做出大量的简化假设。

答案 7 :(得分:1)

您还可以将STL容器中的分配器交换为自定义分配器。