メモリが正しく処理されていないかどうかをどのように知ることができますか?


12

私の(2D)ゲームのメモリフットプリントは、テクスチャをロードするたびに増加するようです。たとえば、ゲームを開始するとき、30 MBのプライベートRAMを使用します。 54 MBのプライベートRAM。

同じことは、同じ距離を移動した後、2つのポイント間を繰り返し往復した後に発生します。

しかし、私の読み出しは、プログラムがテクスチャが画面から消えてから約1秒後にglDeleteTexturesを正しく呼び出していることを示しています。valgrindはリークを検出していません。

これについて心配する必要があるかどうか、またはOSがメモリをページングする方法の単なる癖であるかどうかを知るにはどうすればよいですか?


1
アプリケーションのRAM使用量をどのように決定しましたか?プロファイラーを使用していますか(どれですか?)、またはオペレーティングシステムのタスクマネージャーだけを信頼していますか(どれですか)。
フィリップ

1
kUbuntuのタスクマネージャー、私のデバッガーのプロファイラーは、データを待っているが、何も表示しないことを教えてくれます。
パトリックジーヴス

1
ちなみに、Linuxでメモリ消費を確認するときは、ゲームプロセスで消費されるメモリだけでなく、忘れないでください。マルチプラットフォームゲームで働いていたとき、WindowsバージョンがLinuxバージョンよりもはるかに多くのRAMを消費する理由を疑問に思いました。
フィリップ

2
あなたは何の期待を持つべきではないというglDeleteTextures意志実際に空きメモリ:gamedev.stackexchange.com/questions/136883/...
マクシムスMINIMUS

回答:


21

仮想メモリは、OSから大きなチャンクで割り当てられます。その大きなチャンクで1バイトでも使用されている場合、OSに戻すことはできません。

また、ユーザー空間の割り当てライブラリは、再利用のために一定の量を保持して、OSからのメモリの要求と解放が繰り返し行われるのを防ぎます。

たとえば、テクスチャを割り当てると、OpenGLドライバーは32個のテクスチャスロットのテーブルを予約し、テクスチャを割り当て続け、ドライバーは1024個のテクスチャスロットの大きなテーブルを割り当てる必要があります。この新しいテーブルはRAMの大きなチャンクにスペースを取ります。すべてのテクスチャを解放します。ドライバは、ゲーム/アプリケーションが後で多くのテクスチャを使用する必要があることを期待してテーブルを縮小したり再割り当てしたりしないため、RAMの大部分をOSに戻すことはできません。

これは完全に正常であり、必要です。未使用のRAMは、最終的にアプリで再利用されます。


1
プレイ中に使用量が増え続けても、リークディテクタで何も検出されない場合は、過剰なメモリフラグメンテーションが発生している可能性があることに注意してください。stackoverflow.com/questions/150753/…で説明されているこのような問題を解決するアプローチは、ゲーム開発にも役立ちます。
ジュール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.