Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax

Ответ
 
Опции темы
Старый 13.11.2007, 17:56   #1
Trilliput
Знающий
 
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений
(для 7 пользователей)
Как правильно отчищать память?

В программе есть девять типов расширенных из типа 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(), а затем выгружаю при помощи кода выше. Но в итоге все равно почему-то память куда то уходит - это видно через "Диспетчер задач", правда не так много как без отчистки вообще.
(Offline)
 
Ответить с цитированием
Старый 13.11.2007, 18:09   #2
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Re: Как правильно отчищать память?

Грили уже, нужно занулить все поля экземпляра типа, а потом и весь экземпляр типа.
(Offline)
 
Ответить с цитированием
Старый 13.11.2007, 18:21   #3
Trilliput
Знающий
 
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений
(для 7 пользователей)
Re: Как правильно отчищать память?

Ясно.
Вопрос еще:
Global Image1 LoadImage ("Image.gif")
Type TType1
Field Img

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

End Type
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Bagration (17.04.2008)
Старый 13.11.2007, 18:21   #4
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Как правильно отчищать память?

GCcollect() вызывай сборщик мусора
передает адрес
Null нули переменные типов, листы, имаджи, потоки и т.д.
__________________
(Offline)
 
Ответить с цитированием
Старый 13.11.2007, 18:22   #5
Trilliput
Знающий
 
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений
(для 7 пользователей)
Занулить - это Null или 0?

Как работать с GCCollect(), помощь ответ на этот вопрос не дает ("Запуск уборки мусора" - это не объяснение)? Может есть стандартный пример?
(Offline)
 
Ответить с цитированием
Старый 13.11.2007, 18:55   #6
jimon
 
Сообщений: n/a
Re: Как правильно отчищать память?

Trilliput

img:TImage = LoadImage("blabla.png")
img = null
GCCollect()
вот ответ сразу на три вопроса
 
Ответить с цитированием
Старый 14.11.2007, 08:22   #7
Trilliput
Знающий
 
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений
(для 7 пользователей)
Re: Как правильно отчищать память?

Работает, но как то странно: при первой загрузке разных менющек, циклов и тп занятая память увеличивавется, но при следующих загрузках больше памяти не жрет. (Те загрузка меню + 6мб, потом загрузка игры +15Мб, при этом память как бы отчищается от только что загруженого меню, но показыватся что занято столко же. Выгружаем игру - память не уменьшается, далее загрузка меню - память не жрет, снова грузим меню - памяти не жрет). Все рисунки грузяться в начале как Globals, а потом просто передается адрес полю типа.
(Offline)
 
Ответить с цитированием
Старый 28.11.2007, 01:58   #8
oxid
Нуждающийся
 
Регистрация: 20.08.2006
Сообщений: 54
Написано 3 полезных сообщений
(для 4 пользователей)
Сообщение Re: Как правильно отчищать память?

У БМ немного извратный механизм загрузки имажей - сначала грузятся только пиксмапы, потом при обращении к кадрам имажа для них создаются сюрфейсы. Т.е. полная загрузка имажа происходит при обращении ко всем кадрам. Это весьма извратно, поскольку может вызвать притормаживания на первых кадрах.
Я юзаю при загрузке такую функцию:
 Function imgCacheFrames(img:TImage)
  For Local i%=0 Until img.frames.Length
    img.frame( i )
  Next
End Function
И не имею проблем с геморроем при первом обращении к имажам и жрачке памяти при этом.
Если у тебя имажи глобальные, то очищаться они будут, если ты их переменным НУЛЛ поприсваиваешь. Если ты этого не делаешь, то у тебя память и не уменьшается.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как правильно юзать Unit? beZ_probleM Основной форум 10 01.06.2011 18:34
Хип память demon112 MidletPascal 9 08.07.2009 14:00
В память Koruna Стихотворения 1 21.02.2008 23:54
делим на 0 правильно jimon FAQ 2 02.01.2006 02:02
Очищаем память от детей правильно impersonalis FAQ 0 04.09.2005 22:13


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com