2009-03-26 10 views
4

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html"home-brew" STLのパフォーマンス?

この記事によれば、STLはゲーム開発には適していません。 これについてあなたの考えは何ですか?

現時点でのアプローチは です。パフォーマンス問題の原因が自家製のコンテナ(またはアロケータ)と交換されている場合は、STLを使用してください(まだ来ていませんが、ハイエンドの3Dゲームは行っていません)。 )

答えて

10

あなたのアプローチは、この場合、唯一の標準です。最適化のルール#1は、「ボトルネックがどこにあるかを正確に把握していない限り、最適化しないでください。

STLコンテナを直接使用するのではなく、typedefで定義された型を使用する場合は、後で比較的簡単にコンテナを交換することができます。つまり、次のような意味です:

#include <vector> 

typedef std::vector<int> MyIntVectorType; 

int main() 
{ 
    MyIntVectorType theVector; 
} 
+0

ゲーム開発者にルール#1を採用させることを幸運にします。 :) – chaos

+0

私はゲーム開発者です! :-) –

+0

そして、他の人にルール#1を採用された経験はどうでしたか? :) – chaos

1

STLを使用し、許容範囲内で動作する場合はそのまま使用してください。そうでない場合は、別のものを試してください。既存の実装を試す前に、すでに存在するものを書き直したくないのです。

6

あなたは、STLがカバーの下で何をしているのか知っておく必要があります。たとえば、ベクトルを使用する場合は、ベクトルを任意に拡大させるだけでなく、vector :: resize()を使用して割り当てを行い、一度しか割り当てないようにします。そのようなもの。あなたのアプローチは悪くない - ちょうどあなたの宿題をする。

+1

ベクトル:: reserve() – kizzx2

+0

参照する必要がありますか?あなたが何をしているのか分からないときに、どのように危険なSTLができるかを見てください。 :) –

1

C++で実行された問題の多くは、C++0xに修正されています。

1

ゲーム用に特別に設計されたEASTLのようなものを見るとよいでしょう。

編集:謝罪、私は質問のリンクが別の記事であると思った。

+0

同じリンクが質問の最初の行として与えられました。 –

1

置き換えが必要なコンテナではない場合がありますが、それは含まれているオブジェクトです。私はかつてキー用の文字列を持った大きなstd :: mapを持っていましたが、それは遅すぎました。私はすべてのキーが同じサイズであることに気がついたので、文字列クラスを固定サイズのcharバッファーのラッパーとして書かれた特殊なバージョンに置き換え、パフォーマンスはもはや問題ではありませんでした。

あなたのボトルネックがどこにあるのかを知っていて、簡単な仮定を単純化しない限り、より高速なバージョンを書くことはできません。

1

アロケータをSTLコンテナでスワップして、カスタムアロケータを取得することもできます。

2

ゲームプログラミングを始めたばかりの方であれば、STLを使い、安定しています。あなたは、動作するものと安定しているもので、1フレームまたは2フレームの間に引っかき傷をつけるよりも良いです。しかし、多くのメジャースタジオがそれを使用しない理由は2つあります。

  • ある時点で、システムを制限まで押し込んでください。あなたのエンジンが非常に大きい場合、コンテナの最適化はあらゆる場所(グラフィック、オーディオ、物理など)を得る良い方法です。アセンブリを使用して最適化し、異なる用途のためにコンテナのさまざまな実装を行うことは必須となります。テンプレートはこれまでに最もリーンな実装ではありません。
  • STLは、異なるプレートフォーム(PS2、PS3、Wii、360、PCなど)で異なる実装を持っています。クロスプラットフォームで作業している場合、これらの相違によってシステムの根本的な場所、つまりすべてのプレート形式のコードで問題が発生することがあります。これがあなたに一度起こったとき、あなたは簡単な方法で維持することができるものに移動したいと思うでしょう。

カスタムバージョンのコンテナを持つことは簡単な仕事ではありませんが、それが価値がある場合にのみ実行してください。