forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Как правильно отчищать память? (http://forum.boolean.name/showthread.php?t=5015)

Trilliput 13.11.2007 17:56

Как правильно отчищать память?
 
В программе есть девять типов расширенных из типа TEntity:
Код:

Type TEntity
Field link:TLink
Mehod Remove()
link.Remove
End Method
Method AddLast(list:Tlist)
link=list.addlast(Self)
end method
method Update() Adstract
end type
 
Type TType1 Extends TEntity
Method Update()
...
end method
Function CreateType1:TType1
Local type1:TType1 = New TType1
Type1.AddLast LType1
Return Type1
end function
end type

каждый экземпляр типа заноситься в свой список, те TType1 в LType1. Для отчиски памяти я отчищаю все списки так:
Код:

For O:TObj = EachIn LObj
O.Remove()
Next

Вобщем то у меня все организовано через типы, сначало я создаю объект при помощи TType1.CreateType1(), а затем выгружаю при помощи кода выше. Но в итоге все равно почему-то память куда то уходит - это видно через "Диспетчер задач", правда не так много как без отчистки вообще.

johnk 13.11.2007 18:09

Re: Как правильно отчищать память?
 
Грили уже, нужно занулить все поля экземпляра типа, а потом и весь экземпляр типа.

Trilliput 13.11.2007 18:21

Re: Как правильно отчищать память?
 
Ясно.
Вопрос еще:
Global Image1 LoadImage ("Image.gif")
Type TType1
Field Img

Function Create()
Img = Image1 ' - создает копию объекта Image1 или просто передает его адрес в поле Img
end function

End Type

dimanche13 13.11.2007 18:21

Re: Как правильно отчищать память?
 
GCcollect() вызывай сборщик мусора
передает адрес
Null нули переменные типов, листы, имаджи, потоки и т.д.

Trilliput 13.11.2007 18:22

Занулить - это Null или 0?

Как работать с GCCollect(), помощь ответ на этот вопрос не дает ("Запуск уборки мусора" - это не объяснение)? Может есть стандартный пример?

jimon 13.11.2007 18:55

Re: Как правильно отчищать память?
 
Trilliput

Код:

img:TImage = LoadImage("blabla.png")
img = null
GCCollect()

вот ответ сразу на три вопроса :)

Trilliput 14.11.2007 08:22

Re: Как правильно отчищать память?
 
Работает, но как то странно: при первой загрузке разных менющек, циклов и тп занятая память увеличивавется, но при следующих загрузках больше памяти не жрет. (Те загрузка меню + 6мб, потом загрузка игры +15Мб, при этом память как бы отчищается от только что загруженого меню, но показыватся что занято столко же. Выгружаем игру - память не уменьшается, далее загрузка меню - память не жрет, снова грузим меню - памяти не жрет). Все рисунки грузяться в начале как Globals, а потом просто передается адрес полю типа.

oxid 28.11.2007 01:58

Re: Как правильно отчищать память?
 
У БМ немного извратный механизм загрузки имажей - сначала грузятся только пиксмапы, потом при обращении к кадрам имажа для них создаются сюрфейсы. Т.е. полная загрузка имажа происходит при обращении ко всем кадрам. Это весьма извратно, поскольку может вызвать притормаживания на первых кадрах.
Я юзаю при загрузке такую функцию:
Код:

Function imgCacheFrames(img:TImage)
  For Local i%=0 Until img.frames.Length
    img.frame( i )
  Next
End Function

И не имею проблем с геморроем при первом обращении к имажам и жрачке памяти при этом.
Если у тебя имажи глобальные, то очищаться они будут, если ты их переменным НУЛЛ поприсваиваешь. Если ты этого не делаешь, то у тебя память и не уменьшается.


Часовой пояс GMT +4, время: 12:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot