2011-01-14 6 views
18

GTA IVのようなゲームでは、たくさんのオブジェクトを非常に素早く作成して削除する必要があるので、メモリ管理のタイプに興味があります。どのようにヒープや他のものの断片化を避けるのですか?誰かが正しい方向に私を指すことができるなら、私は本当にそれを感謝します。GTA IVのようなゲームはヒープを断片化しません。

+0

http://stackoverflow.com/questions/4687310/memory-allocation-patterns-in-c/4687324#4687324 –

+0

Modern C++ Designのコピーを入手してください。高速なアロケータを作成する手順を実行します。 –

答えて

23

memory pooling、特化したアロケータ、特殊なコンテナクラスなどを使用します。

  1. マルチスレッドプログラムのためのHoard Memoryアロケータ。
  2. EAのバージョンSTLです。
+0

メモリプール!はい、忘れてしまいました:) – Daniel

1

私は彼らのオブジェクトがほとんど同じサイズであるため、実際にはメモリを解放せず、使用可能とマークし、〜サイズの次のチャンクが割り当てられた内部メモリマネージャを使用するためだと思います。

+0

それは、とにかく 'free()'の簡単な実装です。最初の文の場合は – Artelius

5

多くのオブジェクトを実際に作成して破棄することは、必ずしもヒープフラグメンテーションを意味するわけではありません。多くの場合、オブジェクトのサイズが同じであれば、1つで解放された領域を次の領域に割り当てることができます。

多くの場合、最適化と同じように、プログラムはオブジェクトのメモリを解放したり削除したりすることはありませんが、古いものはプールに残しておき、単に新しいオブジェクトを作成するために内容を上書きします。

+0

+1です。非常に多くの人が断片化について話しており、その意味が分かりません。 –

7

このホワイトペーパーでは特にゲームを参照していませんが、パフォーマンス向上のためにCおよびC++アプリケーションでよく使用される種類のカスタムメモリアロケータを提供しています。注意書き物語のビットです)。

Reconsidering custom memory allocation、多くの場合、カスタムメモリアロケータを使用してパフォーマンスの向上を実現することを望んバーガー、ツォルン&マッキンリー、OOPSLA 2002

はプログラマ。この徹底的な調査では、カスタムアロケータを使用する8つのアプリケーションについて検証します。驚くべきことに、これらのアプリケーションのうちの6つについて、最先端の汎用アロケータ(Leaアロケータ)がカスタムアロケータよりも優れた性能を発揮します。 2つの例外は、パフォーマンスを向上させる領域を使用します(最大44%の改善)。また、プログラマの負担を軽減し、メモリリークの原因を取り除きます。しかし、プログラマが領域内の個々のオブジェクトを解放できないと、メモリ消費量が大幅に増加する可能性があることを示しています。さらに悪いことに、この制限は共通プログラミング慣用句の領域の使用を排除し、その有用性を低下させます。我々は、リープと呼ばれる汎用および領域ベースのアロケータの一般化を提示する。リープは領域とヒープの組み合わせであり、個々のオブジェクトの削除を追加して領域のセマンティクスを完全に提供します。我々は、Reapの実装が高性能を提供し、他のアロケータよりも領域のようなセマンティクスを上回ることを示しています。ケーススタディを使用して、実際のリープのスペース優位性とソフトウェアエンジニアリングの利点を実証します。私たちの結果は、高速領域を必要とするプログラマはリープを使うべきであり、カスタムアロケータを検討しているほとんどのプログラマは代わりにLeaアロケータを使用すべきであることを示しています。

+0

最初の答えがあなたのブログにリンクしていることを嬉しく思っています:) –

6

マルチスレッドの実装のための2つの非常に良いmallocの実装があります。

  • tcmalloc:Googleの
  • jemallocによって:ここでは(例えば)のApacheで使用されるが、

は、Facebookの記事です約improving jemalloc。 Hoardのメモリアロケータが現在のトップアンサーで約5倍高速です:)

+0

その結果は非常に異常です - 私はJason Evansと仕事をして、問題の正確さを確認したいと思っています。 – EmeryBerger

+0

@EmeryBerger:それは私も驚いた、私は確かにあなたがそれを見つけることを願って良いメモリアロケータは、高速ソフトウェアを構築するための最初のレンガです:) –

1

多くのゲームでは、ここで述べたメモリアロケータのいくつかを使用しています。 dlmallocは、私たちが大きな成功を収めて使用したものです(私たちはそれをLuaに結びました)。 dlmalloc hereに関する情報を入手できます。

私が言及しているもう1つのことは、すべてのゲームがダイナミックメモリ割り当てを使用する必要はないということです。我々は、私たちのゲームプレイデータの大部分にmempoolsと静的メモリ領域を使用しました。ダイナミックアロケーションを必要とするシステムだけがそうしています(Luaといくつかの第三者図書館)。私たちが行うことはすべて静的バッファから出てきます。ゲームコードにSTLを使用しないので、メモリの断片化の「損傷」を制限できます。

+0

実際のOS(つまり、Windowsを除くデスクトップ/サーバー/ワークステーションのOS)アルゴリズム的に 'dlmalloc'に非常に近いアロケータです。 'dlmalloc'を' malloc'の置き換えとしてドロップする唯一のシステムは、Windowsと多分ゲームコンソールです(ライブラリの見た目はわかりません)。 –

+0

そうではありません。 Linuxベースのシステムでは一般的にglibcアロケータが使用されています。これは実際にはdlmallocに基づいています。しかし、Windows、FreeBSD、Solaris、AIX、Mac OS Xはすべて異なるメモリアロケータを使用しますが、いずれもdlmallocに基づいていません。 – EmeryBerger

+0

私は、私が非実際のOSについて話していることを明確にすべきだったと思います。個人的な偏りを除いて、私の答えは確かに窓とコンソールの観点から来ていた。 – Mark

関連する問題