Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / DX11. удаление ID3D11Texture2D из видеопамяти

DX11. удаление ID3D11Texture2D из видеопамяти

Страницы: 1 2 3 Следующая »
BernsПостоялецwww9 фев. 201823:20#0
доброго времени.
таки наткнулся на неприятную особенность, а может и просто баг DX11. суть в том, что дергая ресурсы через ->Release(), видеопамять не освобождается судя по графикам, или по крайней мере остается зарезервированной. дебагом всё это дело ковырнуть возможности нет.
читал, что сперва нужно открепить все ссылки на объект следующим кодом, да будет так:
    Context->OMSetRenderTargets(0, nullptr, nullptr);
    ID3D11ShaderResourceView *const pSRV[1] = { NULL };
    Context->PSSetShaderResources(0, 1, pSRV);

в моем проекте обильно используется MRT и более одного текстурного блока, так что дело может быть и в этом.
хорошо, тогда почему при активации этого кода в цикле начинается обильное потребление видеопамяти?

                        ComPtr <ID3D11Texture2D> OCReadID;// <-вставляю отдельно от цикла

      D3D11_TEXTURE2D_DESC textureDesc;
      ZeroMemory(&textureDesc, sizeof(textureDesc));

      textureDesc.Width = 4096;
      textureDesc.Height = 4096;
      textureDesc.MipLevels = 1;
      textureDesc.ArraySize = 1;
      textureDesc.Format = DXGI_FORMAT_R32_UINT;
      textureDesc.SampleDesc.Count = 1;
      textureDesc.SampleDesc.Quality = 0;
      textureDesc.Usage = D3D11_USAGE_DEFAULT;
      textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
      textureDesc.CPUAccessFlags = 0;
      textureDesc.MiscFlags = 0;

      Device->CreateTexture2D(&textureDesc, nullptr, &OCReadID );


    OCReadID.Get()->Release();
    OCReadID.Reset();

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

MrShoorУчастникwww9 фев. 201823:35#1
Berns
Проверять сливаются или нет таким макаром ресурсы не стоит.
Я вот например напарывался:
https://gamedev.ru/code/forum/?id=191132#m7
То есть саллоцировав буфер не стоит рассчитывать на то, что он удалится сразу как ты этого ожидаешь. Но если ты ссылки не держишь, то в какой-то момент он таки удалится.
BernsПостоялецwww10 фев. 20183:32#2
MrShoor
это что же получается, в DX11 и более ранних был заложен AI Ванги и ресурсами он оперирует почти полностью автономно? как тогда быть с загрузкой/выгрузкой текстур, если после того, как оно заполнит видеопамять, начинает глотать оперативку? столкнулся с таким явлением, что память процесса в VS указывало аж 30 гб, прежде чем оно накрывалось, притом что оперативки и видеопамяти втрое меньше в сумме и фреймрет был в терпимых 20 кадрах
MrShoorУчастникwww10 фев. 20184:12#3
Berns
> как тогда быть с загрузкой/выгрузкой текстур, если после того, как оно заполнит
> видеопамять, начинает глотать оперативку?
Видеопамять оно сразу не заполняет. А заполняет только по мере того, какие ресурсы нужны в видеопамяти. То есть если ты просто создал текстуру и никуда её не устанавливал в шейдер, то в видеопамять эта текстура скорее всего не попадет вообще.

> это что же получается, в DX11 и более ранних был заложен AI Ванги и ресурсами
> он оперирует почти полностью автономно?
Это не AI ванги. Это собственный менеджер памяти внутри. У тебя на видеокарте может быть 256Мб видеопамяти, а ресурсов насоздавать ты можешь много больше 256Мб. Поэтому DX сам загружает ресурсы в видеопамять и сам же их и выгружает.

BUzerПостоялецwww10 фев. 20184:13#4
Berns
> еще не приходилось иметь дел с контролем видеопамяти
А в DX11 у тебя его и нет, драйвер сам менеджит память, и освобождает её когда захочет.
Если хочется больше контроля над памятью, то тут уже DX12 нужен.
innuendoПостоялецwww10 фев. 20187:50#5
Berns
> ак тогда быть с загрузкой/выгрузкой текстур,


https://msdn.microsoft.com/en-us/library/windows/desktop/bb174564(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/ff476587(v=vs.85).aspx

Правка: 10 фев. 2018 14:10

BernsПостоялецwww10 фев. 201815:32#6
то тут уже DX12 нужен.

кто-нибудь освоил уже этот бред шизофренников из майкрософт? я так с позором решил от него отказаться после безуспешных попыток пришить массив текстурных семплеров

innuendoПостоялецwww10 фев. 201816:04#7
BUzer
> Если хочется больше контроля над памятью, то тут уже DX12 нужен.

Можно подумать, что там нету драйвера с причудами ?

prowkanПостоялецwww10 фев. 201816:15#8
Мне аж интересно стало, как связаны контроль над памятью и причуды драйвера?
innuendoПостоялецwww10 фев. 201816:26#9
э... кто мой пост удалил ? :)
bykabakПостоялецwww10 фев. 201822:54#10
ID3D11Texture2D* OCReadID;

      D3D11_TEXTURE2D_DESC textureDesc;
      ZeroMemory(&textureDesc, sizeof(textureDesc));

      textureDesc.Width = 4096;
      textureDesc.Height = 4096;
      textureDesc.MipLevels = 1;
      textureDesc.ArraySize = 1;
      textureDesc.Format = DXGI_FORMAT_R32_UINT;
      textureDesc.SampleDesc.Count = 1;
      textureDesc.SampleDesc.Quality = 0;
      textureDesc.Usage = D3D11_USAGE_DEFAULT;
      textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
      textureDesc.CPUAccessFlags = 0;
      textureDesc.MiscFlags = 0;

      Device->CreateTexture2D(&textureDesc, nullptr, &OCReadID );


    OCReadID->Release();

А так, не используя ComPtr , такой же результат с памятью ?

ArchiDevilПостоялецwww11 фев. 201812:05#11
Berns
> кто-нибудь освоил уже этот бред шизофренников из майкрософт?
Все, кому надо, давно уже осилили. Нет там ничего сложного.
innuendoПостоялецwww11 фев. 201812:24#12
ArchiDevil
> Все, кому надо

А кому это надо? Вот лично мне не надо

*Lain*Постоялецwww11 фев. 201813:38#13
Berns
ID3D12Device::Evict method
https://msdn.microsoft.com/en-us/library/windows/desktop/dn788676(v=vs.85).aspx
KrollПостоялецwww2 мар. 201814:57#14
SetRenderTarget и прочее увеличивает счётчик ссылок.
Надо смотреть на счётчик:
ULONG Refs = ID3D11Texture2D::Release();

Проблем с удалением не наблюдал. Если Refs не ноль, сам виноват. Надо искать.

Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр