iPhoneのOpenGL ESテクスチャが本当に割り当て解除されたかどうかを確認することはできますか?
質問
このマニュアルでは次のように書くよう指示されています。
glDeleteTextures(1, &GLtexture);
そしてテクスチャが削除されると主張します。 iPhoneにはメモリが不足しているため、これらのテクスチャが確実にリリースされるようにします。
Leaks機器はこれを検出できません。率直に言って、私は少し心配しています。テクスチャが本当になくなったことを確認したいです。
ありがとう。
解決
テクスチャはObj-cランタイムによって処理されないため、リークはそれらについて何も知りません。別のツールを使用する必要があります。
Xcodeで、OpenGLテンプレートを使用して新しいプロジェクトを開始します。シーンを更新/描画するメソッドを検索し、このコードを最後に追加します:
static int tick = -1;
static GLuint tex[5];
if (tick++ < 0)
for (int f = 0; f < 5; f++)
tex[f] = 0;
tick = tick % 5;
if (tex[tick]) {
glDeleteTextures(1, &tex[tick]);
tex[tick] = 0;
} else {
glGenTextures(1, &tex[tick]);
glBindTexture(GL_TEXTURE_2D, tex[tick]);
char *mem = malloc(1024 * 1024 * 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, mem);
free(mem);
}
コードは、OpenGLコマンドを使用して5つのテクスチャを生成および破棄します。ビルドし、デバイスで一度実行して、インストールされていることを確認します。むちゃくちゃ心配する必要はありません。
楽器を開いて、iPhoneの空のテンプレートから始めます。ライブラリを開き、メモリモニタをウィンドウにドラッグします。情報開示ボタンをクリックして、「Physical Memory Free」以外のすべてのチェックを外します。ここで、iPhoneでバイナリを起動して録音を開始することを選択します。 Instrumentsがアプリケーションをサンプリングしようとするタイミングに応じて、階段パターンが上下に移動するのが見えるはずです。プログラムの実行中に、「リアルメモリ」列にすべてのアクティブなプロセスが表示され、実際のメモリ使用量が表示されます。
私のテストでは、この例は、メモリサンプリングの瞬間に応じて25MB〜3MBを消費します。これは、第2世代のiPhoneおよびSDK 3.1を使用したものです。 2.x SDKを使用している場合、通常のOpenGLモニターでGART Resident Object Sizeを検索する必要があります。 http://をご覧ください。 blog.zincroe.com/2009/04/how-to-check-iphone-texture-memory-usage-with-instruments/ を参照してください。
いずれにせよ、メモリが上下にジャンプすることは、glDeleteTexture()が宣伝どおりに動作することを証明しています。
他のヒント
アロケーションテーブルを維持する独自の関数で glDeleteTextures(int、int *)
の呼び出しをラップします。