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

[решено в сообщении #7] ID3D10Buffer::Map приводит к утечке памяти???

Страницы: 1 2 Следующая »
#0
14:57, 14 июля 2014

В общем был код который создавал буфера по такому алгоритму:
1. Создается новый буфер и инициализруется нужным размером
2. Заполняется из кусков локальной памяти через Device::UpdateSubresource

Если буфер поменялся - старый просто удалялся, на его место создавался новый по алгоритму выше. Т.е. апдейта посути нет, есть просто пересоздание буфера и его заполнение.
Все прекрасно работало, но через Map заполнять было бы эффективнее, и я переделал на ID3D10Buffer::Map. Оно сразу начало течь. Т.е. пересоздаю новый буфер по тому же алгоритму, делаю Map с D3D10_MAP_WRITE_DISCARD, заполняю, делаю Unmap. С каждым апдейтом буферов память не чистится, а т.к. у меня буфер под 30Мб, то после пачки апдейтов Out of memory и приплыли.

Кто-нибудь сталкивался с подобным? Поменялось только заполнение, т.е. аллокация буферов осталась старой. Map/Unmap всегда вызывается парно, причем Unmap вообще в finally блоке, что как бы гарантирует что он будет вызван.

#1
15:56, 14 июля 2014

MrShoor
Мне всегда казалось, что map и update не дружат

#2
16:02, 14 июля 2014

Как выяснилось текут DYNAMIC ресурсы. Собрал минимальный семпл (правда на делфи), в котором видно что ресурсы текут:

+ Показать

Такой бред.... Это что, теперь DYNAMIC не использовать вообще?

#3
16:04, 14 июля 2014

MrShoor
А в дельфях типа память чистить не надо?

#4
16:13, 14 июля 2014

-Eugene-
> А в дельфях типа память чистить не надо?
А в делфях типа ARC, и Buffer := nil; - вызывает Release

#5
16:15, 14 июля 2014

MrShoor
Ух ты какая магия... В дельфях из коробки есть то, что мне нужно было дописывать :(

Почему, кстати, DX10? Он же вовсю мертвый.

#6
16:23, 14 июля 2014

-Eugene-
По велению начальства.
Но на самом деле я думаю подобная проблема будет и в DX11, потому что у меня Win7 и я вижу как DX10 грузит DX11:
Module Load: d3d11.dll. No Debug Info. Base Address: $6D520000. Process D3D10LeakTest.exe (33136)

#7
7:42, 16 июля 2014

В общем может кому пригодится. Суть такова.
DX по видимому чистит память от DYNAMIC буферов на SwapChain->Present(). Если создавать DYNAMIC буфера без свопчейна - то эта память вообще никогда не будет почищена. А если создавать со своп чейном через D3D10CreateDeviceAndSwapChain, но не делать Present - то на моих драйверах оно вообще с BSOD-ом падает на OutOfMemory.

#8
7:53, 16 июля 2014

MrShoor
Спасибо

#9
12:02, 16 июля 2014

-Eugene-
> дельфях из коробки есть то, что мне нужно было дописывать

CComPtr ?

#10
12:05, 16 июля 2014

innuendo
Префикс С уже не сулит ничего доброго

#11
18:34, 10 окт. 2014

Я так и не завёл Map/Unmap для динамических текстур (DX10, но думаю в DX11 тоже самое).
Только через ID3D10Device::UpdateSubresource.
А так делаю: Map, пишу, Unmap. И ничего не происходит, текса не меняется при отображении. Причем на следующем кадре делаю Map
и вижу, что там мои записанные данные. Т.е. пишет а agp память (или куда-то там), а в видео тупо не шлет.

#12
1:23, 11 окт. 2014

-Eugene-
> Почему, кстати, DX10? Он же вовсю мертвый.
Как так? А я только вот рендер, понимаеш, под него переписываю =(

#13
1:44, 11 окт. 2014

Anders333
> > Почему, кстати, DX10? Он же вовсю мертвый.
> Как так? А я только вот рендер, понимаеш, под него переписываю =(
Он не мёртвый, но умирает.
Просто изначально в DX11 заложили весь функционал DX10. И по сути через интерфейсы DX11 работать также как и через интерфейсы DX10. Выбирается через D3D_FEATURE_LEVEL.
Больше скажу. Я у себя на Win7 работаю с DX10 карточкой через интефейсы DX11.1. Тока для этого надо WinSDK от VS2013 и чтобы Win7 SP1 была.
А вот DX11.2 уже требует Win8. Да и не загорами DX12.
Так что лучше сразу пиши на DX11. И книги уже есть, и статьи.
А вот кто точно умер так это DX9.
Но есть еще люди, которые и DX8 юзают.

#14
4:34, 11 окт. 2014

> Он не мёртвый, но умирает.
asvp, он был рождён трупиком. Его пытались реанимировать выходом 10.1, но это не помогло - все нормальные люди ждали ДХ11. Если сейчас посмотреть - то все игры имеют поддержку либо ДХ9, либо ДХ11. Игр, написанных под ДХ10.х фактически нет вообще.

> Тока для этого надо WinSDK от VS2013 и чтобы Win7 SP1 была.
У меня через 11.0 без проблем работает от 9ех до 11.0 и без 2013 студии (точно) и без сервис-пака (вот тут могу ошибаться ибо он стоит давненько).

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

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