Войти
ПрограммированиеФорумГрафика

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

Страницы: 1 2 3 Следующая »
#0
23:20, 9 фев. 2018

доброго времени.
таки наткнулся на неприятную особенность, а может и просто баг 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();

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


#1
23:35, 9 фев. 2018

Berns
Проверять сливаются или нет таким макаром ресурсы не стоит.
Я вот например напарывался:
https://gamedev.ru/code/forum/?id=191132#m7
То есть саллоцировав буфер не стоит рассчитывать на то, что он удалится сразу как ты этого ожидаешь. Но если ты ссылки не держишь, то в какой-то момент он таки удалится.

#2
3:32, 10 фев. 2018

MrShoor
это что же получается, в DX11 и более ранних был заложен AI Ванги и ресурсами он оперирует почти полностью автономно? как тогда быть с загрузкой/выгрузкой текстур, если после того, как оно заполнит видеопамять, начинает глотать оперативку? столкнулся с таким явлением, что память процесса в VS указывало аж 30 гб, прежде чем оно накрывалось, притом что оперативки и видеопамяти втрое меньше в сумме и фреймрет был в терпимых 20 кадрах

#3
4:12, 10 фев. 2018

Berns
> как тогда быть с загрузкой/выгрузкой текстур, если после того, как оно заполнит
> видеопамять, начинает глотать оперативку?
Видеопамять оно сразу не заполняет. А заполняет только по мере того, какие ресурсы нужны в видеопамяти. То есть если ты просто создал текстуру и никуда её не устанавливал в шейдер, то в видеопамять эта текстура скорее всего не попадет вообще.

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

#4
4:13, 10 фев. 2018

Berns
> еще не приходилось иметь дел с контролем видеопамяти
А в DX11 у тебя его и нет, драйвер сам менеджит память, и освобождает её когда захочет.
Если хочется больше контроля над памятью, то тут уже DX12 нужен.

#5
7:50, 10 фев. 2018

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

#6
15:32, 10 фев. 2018
то тут уже DX12 нужен.

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

#7
16:04, 10 фев. 2018

BUzer
> Если хочется больше контроля над памятью, то тут уже DX12 нужен.

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

#8
16:15, 10 фев. 2018
Мне аж интересно стало, как связаны контроль над памятью и причуды драйвера?
#9
16:26, 10 фев. 2018

э... кто мой пост удалил ? :)

#10
22:54, 10 фев. 2018
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 , такой же результат с памятью ?

#11
12:05, 11 фев. 2018

Berns
> кто-нибудь освоил уже этот бред шизофренников из майкрософт?
Все, кому надо, давно уже осилили. Нет там ничего сложного.

#12
12:24, 11 фев. 2018

ArchiDevil
> Все, кому надо

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

#13
13:38, 11 фев. 2018

Berns
ID3D12Device::Evict method
https://msdn.microsoft.com/en-us/library/windows/desktop/dn788676(v=vs.85).aspx

#14
14:57, 2 мар. 2018

SetRenderTarget и прочее увеличивает счётчик ссылок.
Надо смотреть на счётчик:
ULONG Refs = ID3D11Texture2D::Release();

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

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.