Очистка текстуры DirectX в C ++ - PullRequest
1 голос
/ 13 декабря 2011

В настоящее время я работаю над игрой на C ++ с использованием DirectX.Двигатель был дан нам профессором в моей школе, и я проверял утечки памяти в его двигателе, и я считаю, что проследил их до этого метода.Для начала, он даже не вызывался, и теперь, когда он вызывается, я не уверен, является ли это правильным способом полного удаления и очистки текстур, загруженных DirectX.

Вот метод, который вызывается наTextureManager:

void DirectXTextureManager::clear()
{
    map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator it;
    map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator itToErase;
    it = textures->begin();
    while (it != textures->end())
    {
    wchar_t *keyToDelete = (*it).first;
    LPDIRECT3DTEXTURE9 textureToDelete = (*it).second;
    itToErase = it;
    it++;
    textures->erase(itToErase);
    delete keyToDelete;
    textureToDelete->Release();
    textureToDelete = NULL;
    }

    stringTable->emptyStringTable();
}

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Что касается текстурной части, все выглядит нормально - достаточно вызвать Release() для LPDIRECT3DTEXTURE объекта, чтобы освободить его:

LPDIRECT3DTEXTURE9 textureToDelete = (*it).second;
...
textureToDelete->Release();

Я немного беспокоюсь о stringTable - этоэто часть, ответственная за wchar_t* в ключах карты?Если это так, вам следует проверить, что делает stringTable->emptyStringTable(), возможно, нет необходимости удалять ключи вручную.

0 голосов
/ 14 декабря 2011

Есть ли у DirectXTextureManager какие-либо другие методы, которые вызывают Release() для каких-либо текстур?

Если это так, то, возможно, нет необходимости вызывать clear().В частности, проверьте, существует ли деструктор класса или какой-либо другой метод "UniInitialize()", который уже может выполнить очистку.Лично я также предпочитаю использовать макрос SAFE_RELEASE() из заголовков DXUT, поскольку он проверяет, является ли указатель ненулевым перед вызовом Release, и устанавливает его в NULL впоследствии.

Наконец, вы можете найти отладкупроще с выводом из среды выполнения отладки DirectX, которая управляется из «панели управления DirectX» (устанавливается вместе с SDK).Он выведет очень хорошее ведение журнала в окно вывода VisualStudio, включая сведения о невыпущенных ресурсах при завершении работы, которые можно использовать для устранения неполадок кода.

...