Функция выпуска DirectX с текстурами (C++)

У меня вопрос по DirectX 9, текстурам и их выпуску. В настоящее время я создаю 2D-игру на C++. У меня есть много текстур, которые я загружаю с помощью D3DXCreateTextureFromFileEx, а затем, переходя от этой «сцены», освобождаю их с помощью Texture->Release(); что хорошо.

Я сделал класс, который имеет дело со списком игровых предметов. В нем я загружаю текстуры для каждого из элементов при создании класса, и когда игра выходит, она выпускает каждую из этих текстур. Однако я продолжаю сталкиваться с проблемой.

Несмотря на то, что я уже загрузил текстуру, если я не нажму ->draw(), программа вылетит при попытке ее освободить.

Кто-нибудь может объяснить, почему это так? Я предполагаю, что мне понадобится какая-то условная проверка, чтобы увидеть, была ли текстура нарисована, прежде чем я попытаюсь ее ->release()?

РЕДАКТИРОВАТЬ:

Вот сильно разбавленная версия того, что я пытался описать. Это работает, но если вы закомментируете строку d3dspt->Draw, произойдет сбой при выпуске текстуры. Похоже, что он может выпускать текстуры только после того, как они были нарисованы. Я предположил, что вам нужно будет отпустить их после того, как вы загрузите их и закончите с ними, независимо от того, были они нарисованы или нет. Я просто искал подтверждение, объяснение или что-то еще, что могло бы просветить меня. На данный момент я добавил логическое значение к каждой текстуре, чтобы проверить, была ли она нарисована или нет, когда я ее выпускаю.

LPDIRECT3DTEXTURE9 Texture;

D3DXCreateTextureFromFileEx(d3ddev,
                        L"Texture.png",
                        D3DX_DEFAULT,
                        D3DX_DEFAULT,
                        D3DX_DEFAULT,
                        NULL,
                        D3DFMT_A8R8G8B8,
                        D3DPOOL_MANAGED,
                        D3DX_DEFAULT,
                        D3DX_DEFAULT,
                        NULL,
                        NULL,
                        NULL,
                        &Texture);

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
d3dspt->Begin(D3DXSPRITE_ALPHABLEND);

D3DXVECTOR3 TextureCentre(0.0f, 0.0f, 1.0f);
D3DXVECTOR3 TexturePos(0.0f, 0.0f, 1.0f);

d3dspt->Draw(Texture, NULL, &TextureCentre, &TexturePos, D3DCOLOR_ARGB(255, 25, 255, 255));

d3dspt->End();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);

Texture->Release();`

person Moph    schedule 05.05.2013    source источник
comment
Я не уверен в том, как это работает. Но это должно быть в основном как подсчет ссылок. Может быть, вы могли бы попытаться проверить количество после того, как вы его создали.   -  person silvesthu    schedule 05.05.2013


Ответы (1)


IDirect3DTexture9 *Texture;

Texture = //Load Texture. Hope u did it.

При выпуске

if(Texture)
{
    Texture->Release();
    Texture = NULL;
}

если это не решит. Загрузите ваш код.

person Dilhan Geeth    schedule 15.05.2013
comment
Если вы закомментируете строку функции Draw, программа вылетит. - person Moph; 18.05.2013