Всем привет!
Недавно опять вернулся к использованию DX9. В простое винда съедает 150-175 Мб видеопамяти.
Создаю 100 прямоугольничков, в каждый из них толкаю текстуру 256х256 весом 192 Кб (BMP, экспериментировал с ней же, но в PNG - 0 толку).
Загружаю каждую намеренно каждый раз с помощью
D3DXCreateTextureFromFileEx(Direct, "тут путь к текстуре", D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_XRGB( R,G,B), nil, nil, texture);
Вывожу прямоугольники так:
Direct.BeginScene;
Direct.SetStreamSource( 0,Buffer,0,SizeOf( TVertexRectangleTexture));
//устанавливаем формат вершин
Direct.SetFVF( D3DFVF_VERTEXTEXTURE);
// Устанавливаем мировую матрицу для прямоугольника
Direct.SetTransform( D3DTS_WORLD, WorldMatrix);
Direct.SetTexture( 0,texture); //устанавливаем текстуру
//рисуем примитив
Direct.DrawPrimitive( D3DPT_TRIANGLESTRIP,0,2);
//удаляем текстуру
Direct.SetTexture( 0,nil);
Direct.EndScene;Устанавливаю камеру так, чтобы все было видно на экране. Приложение съедает 51 Мб видеопамяти. С PNG все то же самое.
Вопрос, это нормально? Так и должно быть?
Ramm
> Приложение съедает 51 Мб видеопамяти
> Вопрос, это нормально? Так и должно быть?
Судя по всему - да.
Причина: драйвер может взять сколько ему вздумается
памяти "про запас", исходя ,к примеру, из величины доступного объема.
А вот если она постоянно растёт - "бей в барабаны" это уже явно утечка.
EDIT: не заметил.
Ramm
>Загружаю каждую намеренно каждый раз с помощью
То-есть одну и ту же текстуру ты 100 раз грузишь из файла и создаешь объект
IDirect3DTexture9 ?
Direct.BeginScene;
Direct.SetStreamSource( 0,Buffer,0,SizeOf( TVertexRectangleTexture));
//устанавливаем формат вершин
Direct.SetFVF( D3DFVF_VERTEXTEXTURE);
// Устанавливаем мировую матрицу для прямоугольника
Direct.SetTexture( 0,texture); //устанавливаем текстуру
for ( i=0; i<100; i++)
{
Direct.SetTransform( D3DTS_WORLD, transforms[i]);
//рисуем примитив
Direct.DrawPrimitive( D3DPT_TRIANGLESTRIP,0,2);
}
//удаляем текстуру
Direct.SetTexture( 0,nil);
Direct.EndScene;надеюсь в оригинале это как так.
ну и текстуру надеюсь грузишь 1 раз, иначе это уже +26 мб
тогда все норм.
Mira
> ну и текстуру надеюсь грузишь 1 раз, иначе это уже +26 мб
26 Мб? Откуда и зачем?
Mira
Не-не-не, я имитирую загрузку ста разных текстур, поэтому гружу их для каждого прямоугольника заново.
Вопрос и был в том, почему 100*192Кб съедают 51 мб памяти, а не 20.
В общем, провел эксперимент, разместил на экране 5133 квадратиков, 5133*192/1024=963Мб памяти. Все отрисовались. Больше квадратов не рисуется, начинает часть выводиться без текстуры.
TheLightWay
> То-есть одну и ту же текстуру ты 100 раз грузишь из файла и создаешь объект
Ага.
Похоже, что причина в этом:
TheLightWay
> драйвер может взять сколько ему вздумается
> памяти "про запас", исходя ,к примеру, из величины доступного объема.
Ramm
> тут путь к текстуре
...
innuendo
> ...
???
Ramm
а в чем фишка застрать всю видеопамять одной и тойже текстурой если можно накладывать одну и туже?
дай угадаю - у тебя карта 1к vram, а дальше просто кончилась память под текстуры)
D3DPOOL_MANAGED
и
>съедают 51 мб памяти, а не 20.
наверное как-то связаны, на случай потери контекста?
Ramm
> Приложение съедает 51 Мб видеопамяти.
Как меряешь?
Может ты создал себе еще десяток бэкбуфферов в придачу. )))
> Создаю 100 прямоугольничков, в каждый из них толкаю текстуру 256х256 весом 192
> Кб (BMP, экспериментировал с ней же, но в PNG - 0 толку).
какая разница из чего ты грузишь , чекни формат полученной текстуры, там полюбасу XRGB или ARGB, а это батенька - 256 * 256 * 4 = 256 кб
Mira
> а в чем фишка застрать всю видеопамять одной и тойже текстурой если можно
> накладывать одну и туже?
Да ладно? А, надо создать 100 разных текстур, чтобы заполнить память? Нахрена?
Mira
> 256 * 256 * 4 = 256 кб
И почему тогда 100 текстур съедают 51 мб, а не 26?
Executor
> Как меряешь?
Программа от MSI... Нет сейчас под рукой.
Ramm
> Да ладно? А, надо создать 100 разных текстур, чтобы заполнить память? Нахрена?
что ты успешно и делаешь)
Ramm
> И почему тогда 100 текстур съедают 51 мб, а не 26?
а сколько приложение жрет без загрузки текстур?
А мип-мап уровни уже не считаются?
codingmonkey
> D3DPOOL_MANAGED
> и
> > ъедают 51 мб памяти, а не 20.
> наверное как-то связаны, на случай потери контекста?
Ресурсы в пуле памяти, под управлением ДХ. Резервная копия, вроде как, лежит в ОЗУ.
Mira
> а сколько приложение жрет без загрузки текстур?
2 Мб. Что-то около того.
Mr. Rabbit
> А мип-мап уровни уже не считаются?
Я так понимаю, что они автоматически не создаются.
Тут как раз и была цель, узнать куда уходит память, ее расходуется иногда больше, чем надо...
Тема в архиве.