d3d9 sprite/texture reset

atizoff

приобретаю кашель за деньги
Автор темы
Проверенный
1,295
1,178
Всем привет, добавил в свой код рисование картинки с байтов:

C++:
void CRender::DrawTexture(int x, int y, LPDIRECT3DTEXTURE9 pTexture, LPD3DXSPRITE pSprite)
{
    pSprite->Draw(pTexture, NULL, NULL, &D3DXVECTOR3(x, y, 0.0f), 0xFFFFFFFF);
}
void CRender::DrawImage(int x, int y, LPDIRECT3DTEXTURE9 pTexture, LPD3DXSPRITE pSprite, PBYTE pByte, std::size_t size)
{
    if (pTexture == NULL)
        D3DXCreateTextureFromFileInMemory(this->pDevice, pByte, size, &pTexture); //Create image from array
    if (pSprite == NULL)
        D3DXCreateSprite(this->pDevice, &pSprite); //sprite
    pSprite->Begin(D3DXSPRITE_ALPHABLEND);
    DrawTexture(x, y, pTexture, pSprite);
    pSprite->End();
}

Всё работает, но 1 но, как его ресетать? При смене разрешения соответсвенно вылет приложения. Можете пожалуйста подсказать код для ресета?
 
Решение
собстсвенно фикс, если кто-то стоклнётся с такой же проблемой.

иницализация переменных где вам удобно:

C++:
    LPDIRECT3DTEXTURE9 pTexture;
    LPD3DXSPRITE pSprite;

иницализация функций:

C++:
void CRender::DrawTexture(int x, int y, LPDIRECT3DTEXTURE9 pTexture, LPD3DXSPRITE pSprite)
{
    pSprite->Draw(pTexture, NULL, NULL, &D3DXVECTOR3(x, y, 0.0f), 0xFFFFFFFF);
}
void CRender::DrawImage(int x, int y, LPDIRECT3DTEXTURE9 pTexture, LPD3DXSPRITE pSprite)
{
    pSprite->Begin(D3DXSPRITE_ALPHABLEND);
    DrawTexture(x, y, pTexture, pSprite);
    pSprite->End();
}

в dllmain.cpp -> hook present/end scene, там где вы иницилизируете фонты (его также нужно вызвать 1 раз), вставляем это (LI_FN - LAZY IMPORT):

C++:
...

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
текстуры только релизить и загружать заново, если они не в managed пуле
Ну, в данном случае не требуется:

Remarks​

The function is equivalent to D3DXCreateTextureFromFileInMemoryEx(pDevice, pSrcData, SrcDataSize, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppTexture).
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Странно, у меня при загрузке через D3DXCreateTextureFromFileInMemory были траблы с релизом текстур. Документация точна тут, или как и обычно с DX9?
Дока с msdn, верна или нет - хз
D3DXCreateTextureFromResource - точно создавал в managed пуле, проверял
 

atizoff

приобретаю кашель за деньги
Автор темы
Проверенный
1,295
1,178
У спрайта есть методы onLostDevice и onResetDevice, текстуры только релизить и загружать заново, если они не в managed пуле
При вызове их краш. Проблему решил сам, буду дома напишу тут как решил
 

atizoff

приобретаю кашель за деньги
Автор темы
Проверенный
1,295
1,178
собстсвенно фикс, если кто-то стоклнётся с такой же проблемой.

иницализация переменных где вам удобно:

C++:
    LPDIRECT3DTEXTURE9 pTexture;
    LPD3DXSPRITE pSprite;

иницализация функций:

C++:
void CRender::DrawTexture(int x, int y, LPDIRECT3DTEXTURE9 pTexture, LPD3DXSPRITE pSprite)
{
    pSprite->Draw(pTexture, NULL, NULL, &D3DXVECTOR3(x, y, 0.0f), 0xFFFFFFFF);
}
void CRender::DrawImage(int x, int y, LPDIRECT3DTEXTURE9 pTexture, LPD3DXSPRITE pSprite)
{
    pSprite->Begin(D3DXSPRITE_ALPHABLEND);
    DrawTexture(x, y, pTexture, pSprite);
    pSprite->End();
}

в dllmain.cpp -> hook present/end scene, там где вы иницилизируете фонты (его также нужно вызвать 1 раз), вставляем это (LI_FN - LAZY IMPORT):

C++:
        LI_FN(D3DXCreateTextureFromFileInMemory)(draw.pDevice, myFile, sizeof(myFile), &draw.pTexture);
        LI_FN(D3DXCreateSprite)(draw.pDevice, &draw.pSprite);

вызов где хотим там и ставим, главное чтобы потом это вызвалось в хуке сцены после инициализации фонта и прочего шлака:

C++:
        draw.DrawImage(pViewport.Width - 100, -30, draw.pTexture, draw.pSprite);

Всем хорошего дня!
 
  • Нравится
Реакции: sizeoftrickster

atizoff

приобретаю кашель за деньги
Автор темы
Проверенный
1,295
1,178
Согласен) Чуть протупил) Всего лишь один раз)
может произойти не утечка, а перегруз как я называю, не знаю как правильнее. лютое сжирание фпс при куче LI_FN, поэтому не рекомендую использовать lazy_import везде