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

[Direct3D9]Видео память

Страницы: 1 2 3 4 5 Следующая »
#0
12:31, 12 июля 2019

Добрый день,

Столнуля я с проблемой, нужно экпертное мнение. Значит есть игра на D3D9, она создает определенное количество ресурсов графики - текстуры, буферы и т.д. Случаются такие моменты, когда функция
D3DXCreateTextureFromFileEx() не может создать текстуру, при этом не сообщая что памяти не хватает, или D3DXGetImageInfoFromFile не может найти файл, который только что был загружен и освобожден, при этом функция GetAvailableTextureMem() показывает огромное количество свободной памяти.

Я было грешил на какие-либо ошибки в освобождении памяти, но это случается иногда и при первой загрузке, только если происходит загрузка состояния из файла, в этом случае я не делаю никаких преднамеренных release() для видео ресурсов.

Не сталкивался никогда с подобным, потому что раньше обчно имел дело с приложениями, требующими мало памяти, но и сейчас весь объем графического контента не превышает и 1 ГБ в текстурах dds, которые хранятся без сжатия в основном в DXT3.

Подкиньте мне идей, что это может быть.


#1
12:52, 12 июля 2019

Osiris
dxsdk/bin/x64/dxcpl  там выкрутить на максимум DebugOutputLevel поставить Use Debug Version и Break On D3D9 Error

#2
15:26, 12 июля 2019

Osiris
> Подкиньте мне идей, что это может быть.
фрагментация памяти.

#3
15:28, 12 июля 2019

Oxyd
> dxsdk/bin/x64/dxcpl  там выкрутить на максимум DebugOutputLevel поставить Use
> Debug Version и Break On D3D9 Error
Насколько помню не работает Debug Level на Win 8, 10 для D3D 9.

#4
15:32, 12 июля 2019

Suslik
> фрагментация памяти.
Не думаю, во-первых занято 1,2 из 4-х всего, во-вторых было много выделений памяти, в том числе мелких, но удалений в самом плохом случае (когда прямо с загрузки не создает текстуру) не было вообще.

#5
(Правка: 15:42) 15:40, 12 июля 2019

Osiris
> Не думаю, во-первых занято 1,2 из 4-х всего
во-первых, объём физической памяти тут не играет никакой роли, так как фрагментация относится к размеру адресного пространства. во-вторых, если у тебя x86 приложение, то никто тебе все 4 гига адресного пространства не даст, по умолчанию себе система резервирует половину. если из оставшихся 2Гб занято 1.2,то есть все шансы, что в остатке не будет ни одного куска больше мегов 50, при этом количество твоих удалений не играет особой роли, так как у самого crt есть серьёзная фрагментация.

#6
15:45, 12 июля 2019

Suslik
>по умолчанию себе система резервирует половину
Не думаю что это так, если запустить Ведьмака какого,то с ним сразу же памяти видео занято до предела, далеко не 2 ГБ, но даже будем считать что система приложению выделила 2ГБ только - на момент старта это 400 Мб, в пике в работе - это 1200 Мб, то есть грубо подсчитанные мною по объему текстур параметры в районе 800 Мб видео памяти сохраняются, далее - считаем что появляется фрагментация - вопроса два - с чего вдруг? и как с этим боротся?

П.С в 50 мб кусок у меня влезет любой атлас по размеру.

#7
17:46, 12 июля 2019

HCDev
> Пути юзаешь абсолютные или относительные? Может забываешь восстановить curent
> path?
Увы нет, пути полные.

>Это если он прогает на студии... У меня в Билдере такого нет :(
VS2010, 2015, но оно не поддерживается больше, проверил.

#8
17:59, 12 июля 2019

Osiris
> VS2010, 2015, но оно не поддерживается больше, проверил.
да они дропнули поддержку на ос выше семерки.. правда есть возможность установить "checked" версию win10, но это такое, проще семерку поставить

подробнее тут
http://snaptip.com/xzftciqxlw/using-debug-version-of-directx-9
https://docs.microsoft.com/ru-ru/windows-hardware/drivers/devtest… checked-build

#9
(Правка: 18:15) 18:12, 12 июля 2019

HCDev
> Не то, чтобы решение, но попробуй на макросах сделать свою обертку над
> D3DXCreateTextureFromFileEx,
не думаю что дело вообще в функциях загрузки текстур, вообще по идеи, он уже должен был использовать D3DXCreateTextureFromFileInMemoryEx, потому что наверное спрятал куда нить ресурсы игры.

Пул там D3DPOOL_MANAGED, иначе он замучается потом их восстанавливать при потере устройства.

#10
18:50, 12 июля 2019

HCDev
> , а deb_create_texture будет сперва проверять возможность чтения файла (вдруг
> он заблокирован для чтения)
Не все так просто, это не всегда один и тот же файл, просто место примерно тоже.

Кстати, вспомнил такую вещь, что один раз я получал out of video memory на создание вершинного буфера, когда было по ошибке много частиц при создании сцены после удаления, но там была понятная ошибка, хотя тоже при непонятных обстоятельствах - памяти для текстур все еще показывало много, но возможно буферы не могут ее использовать?

#11
19:03, 12 июля 2019

Osiris
> считаем что появляется фрагментация - вопроса два - с чего вдруг?
Вариант 1 - утечки памяти.
Представь, что у тебя в памяти подряд лежат:
100байт, 40Мб, 100б, 40Мб, 100б, 40Мб, 100б, 40Мб, 100б, 40Мб
Каждые из этого списка утекают, а 40Мб корректно сливаются. В результате имеем кучу свободной памяти, но выделить кусок больше 40Мб не можем.
> и как с этим боротся?
Не делать утечек

Вариант 2 - много мелких объектов.
Представь ту же самую очередь, но 100б не утекают, а просто аллоцируются, и нужны.
> и как с этим боротся?
Складывать мелкие объекты в один пул, чтобы картина была не
100байт, 40Мб, 100б, 40Мб, 100б, 40Мб, 100б, 40Мб, 100б, 40Мб
а
100байт, 100б, 100б, 100б, 100б, 40Мб, 40Мб, 40Мб, 40Мб, 40Мб

#12
(Правка: 19:28) 19:22, 12 июля 2019

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

MrShoor
Спасибо за разъяснение, это очень похоже на правду, пару вопросов
>Вариант 1 - утечки памяти.
Утечка памяти подразумевает, что я выделяю память и не освобождаю ее, при чем в процессе жизни приложения, это ведет к росту занятой памяти, но все же тут есть два фактора - во-первых мое приложение если уж загрузилось, то работает долго и без проблем (рост как видео так и оперативной памяти не наблюдается), кроме того у меня нет аллокаций на видео в рантайме вообще.

>Вариант 2 - много мелких объектов.
Очень похоже, что так, у меня действительно много мелких буфферов частиц в этой версии движка, они такое могут сделать, а что подразумевается под складываением объектов в один пул? Выделять для таких объектов сразу большие буферы и подразбивать их?

#13
19:49, 12 июля 2019

Osiris
> но все же тут есть два фактора - во-первых мое приложение если уж загрузилось,
> то работает долго и без проблем
Ну крупные ресурсы уже разместило. А мелкие утечки (которые вполне могут быть разовыми скажем на этапе загрузки) - уже не так страшны.
Все таки советую погонять DrMemory на своем приложении: https://github.com/dynamorio/drmemory

> Выделять для таких объектов сразу большие буферы и подразбивать их?
Да.

#14
(Правка: 20:07) 20:02, 12 июля 2019

Ради эксперимента, загрузи только одну текстуру, или модель(со всеми ресурсами) , столько раз, чтобы памяти стало больше чем 1.2гига. Посмотри позволит ли dx9 загрузить больше или нет.

>out of video memory
часто такое получал, когда грузил больше 1.3гигов, и на win10 машине с 32/64 гигами видео, и на xp с 2гигами оперативы и встроенной видеокартой.

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