Утечка памяти

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Утечка памяти

Сообщение leaveIIIusion » 12.01.2006 (Чт) 22:36

Если кто помнет в 98-м (а может и в 2000, не помгю уже) виндовсе была заставочка в виде трехмерного лабиринта. Там герой трется о внешнюю стену, ходит по потолкам, топчет крыс и в конце концов доходит до странного объекта, который служит следующим генерированием уровня. Решил сделать примерно тоже, но круче.

Вообщем сделал так, чтобы в буфер вершин записывались только те стены, полы и потолки, которые можно увидеть. По идее, через некоторое время, когда герой протопает некоторое расстояние, нужно создавать буфер нового размера и заново его заполнять.
Делаю так (на DX9):

Код: Выделить всё
VB = Nothing
VB = New Direct3D.VertexBuffer( ставлю новый размер )
'Lock, Unlock, вообщем заполняю


Но строка VB = Nothing не помогает и не очищает память.
По идее можно эту память освобождать при помощи комманды
Код: Выделить всё
VB.Dispose()

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

Кстати, такой же глюк встречается в туториалах в SDK. Там при изменении размера окна так же создается новый буфер. Если открыть Task Manager и потаскать угол формы из туториала туда-сюда, то через совсем небольшые промежутки времени у вас будет сьедаться большие объемы памяти. Попробуйте.

Посмотрел обычные примеры в SDK. В них утечек памяти нет, но между перетаскиванием и рисованием картинки проходит довольно длительное время. Конечно я могу сделать, что вроде как мой герой, бегающий по лабиринту на каждом шаге обдумывает действия, пока создается новый буфер, но это не выход :? . Честно говоря я просто еще не в состоянии разобрать пример из СДК и понять как ликвидируют утечку :oops: .

Кто что может посоветовать по этому поводу? Предлагать создавать один буфер фиксированной длины в последнюю очередь. Кроме того после Alt+Tab все-равно прийдется его пересоздавать. Кто как делает?
Basic .NET ruless world!

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 13.01.2006 (Пт) 6:11

По-моему, надо сначала VB.Dispose, потом VB = Nothing, а потом VB = New Direct3D.VertexBuffer( ставлю новый размер ). Сама переменная не может удаляться

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 13.01.2006 (Пт) 20:25

mdx писал(а):По-моему, надо сначала VB.Dispose, потом VB = Nothing, а потом VB = New Direct3D.VertexBuffer( ставлю новый размер ). Сама переменная не может удаляться

Точно. Спасибо :D ! Не течет :lol: . Только немного не так нужно. Сначала необходимо один раз создать буфер, а потом уже его "диспозить" и пересоздавать. Видимо, ресурсы из-под несозданного буфера освобождать нельзя :roll: . В этом я и ошибся. Как всегда на мелочах :oops: ... Еще раз спасибо за помощь :) .
Basic .NET ruless world!


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList