У меня вопрос по 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();`