0

ロードおよびアンロードできる複数のレベルを持つ 2D ゲームを使用しています。

テクスチャの処理を簡単にするために、すべてのテクスチャのリストを持つ TextureLoader クラスを作成しました。ゲーム内のオブジェクトがテクスチャを使用したい場合、使用したいテクスチャへのパスのみがあり、TextureLoader に同じパスでテクスチャへのポインタを取得できます。次に、テクスチャがリストに存在しない場合、TextureLoader はポインタを返す前にそれをロードしようとします。

これはゲーム全体で問題なく機能し、レベルをリロードしてもメモリ使用量は変わりません。

しかし、新しいレベルをロードするとき、明らかに前のレベルをアンロードしたいのですが、うまくいかないようです。

そこでglDeleteTexturesの出番です。

だから私がやろうとしていることは次のとおりです。

int arraySize = textures.size();
GLuint* arr = new GLuint[arraySize];
int x = 0;
for (std::list<Texture2D*>::iterator it = textures.begin(); it != textures.end(); ++it)
{
    arr[x] = (*it)->getImage();
    x++;
}
glDeleteTextures(arraySize, arr);

textures.clear();

メモリへのポインターは別の Texture2D クラスに格納されているため、glDeleteTextures を呼び出す前にそれらすべてを収集しようとします。

ただし、スタックオーバーフローに達するまで、メモリ使用量はレベルごとに増加し続けます。

 getImage()

最初にテクスチャをバインドしたときに取得したテクスチャへのポインターを含む Gluint を返します。

私は何を間違っていますか?

4

2 に答える 2

1

「x」をインクリメントしていません。

さらに、配列のメモリをリークします。なぜベクトルを使用しないのですか?

std::vector<GLuint> arr;
arr.reserve(textures.size());
for (std::list<Texture2D*>::iterator it = textures.begin(); it != textures.end(); ++it)
{
    arr.push_back((*it)->getImage());

    // Are you missing:
    // delete *it;
}
if (!arr.empty()) {
    glDeleteTextures(arr.size(), &arr[0]);
}
textures.clear();
于 2012-08-27T14:03:55.243 に答える
0

VRam の使用状況を監視した後、Vram が適切に解放されていることがわかります。これは、OpenGL がシステム RAM にコピーを保存し、glDeleteTextures() を呼び出しても解放されないためです。

于 2012-08-28T09:16:21.540 に答える