Вообщем сделал так, чтобы в буфер вершин записывались только те стены, полы и потолки, которые можно увидеть. По идее, через некоторое время, когда герой протопает некоторое расстояние, нужно создавать буфер нового размера и заново его заполнять.
Делаю так (на DX9):
- Код: Выделить всё
VB = Nothing
VB = New Direct3D.VertexBuffer( ставлю новый размер )
'Lock, Unlock, вообщем заполняю
Но строка VB = Nothing не помогает и не очищает память.
По идее можно эту память освобождать при помощи комманды
- Код: Выделить всё
VB.Dispose()
Но в этом случае удаляется и сама переменная, которая в моем случае Private, то есть используется при всей работе программы. В принципе можно создавать каждый раз заново локальные переменные и таскать их с собой через всю программу аж до рендеринга, но мне эта мысль не понравилась.
Кстати, такой же глюк встречается в туториалах в SDK. Там при изменении размера окна так же создается новый буфер. Если открыть Task Manager и потаскать угол формы из туториала туда-сюда, то через совсем небольшые промежутки времени у вас будет сьедаться большие объемы памяти. Попробуйте.
Посмотрел обычные примеры в SDK. В них утечек памяти нет, но между перетаскиванием и рисованием картинки проходит довольно длительное время. Конечно я могу сделать, что вроде как мой герой, бегающий по лабиринту на каждом шаге обдумывает действия, пока создается новый буфер, но это не выход . Честно говоря я просто еще не в состоянии разобрать пример из СДК и понять как ликвидируют утечку .
Кто что может посоветовать по этому поводу? Предлагать создавать один буфер фиксированной длины в последнюю очередь. Кроме того после Alt+Tab все-равно прийдется его пересоздавать. Кто как делает?