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

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

Страницы: 1 2 3 Следующая »
#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();

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

9 фев. 2018

#1

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

9 фев. 2018

#2

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

10 фев. 2018

#3

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

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

10 фев. 2018

#4

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

10 фев. 2018

#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)

#6
то тут уже DX12 нужен.

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

10 фев. 2018

#7

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

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

10 фев. 2018

#8
Мне аж интересно стало, как связаны контроль над памятью и причуды драйвера?

10 фев. 2018

#9

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

10 фев. 2018

#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 , такой же результат с памятью ?

10 фев. 2018

#11

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

11 фев. 2018

#12

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

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

11 фев. 2018

#13

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

11 фев. 2018

#14

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

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

2 мар. 2018

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