forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Проблемка с памятью (http://forum.boolean.name/showthread.php?t=14544)

Reizel 07.04.2011 19:02

Проблемка с памятью
 
есть класс


type TPro
field COUNT_FRAMES:int
field IMAGE:TImage
end type


type Ololo extends TObject
field PRO:TPro
field X,Y:int
field CurrentFrame:int

method Draw()
DrawImage PRO.IMAGE,X,Y,CurrentFrame
end method
end type


Когда вызывается метод Draw() типа Ololo, прога начинает жрать память , от 58 до 400 мб.
оказалось, что память жрет строчка
DrawImage PRO.IMAGE,x,y,CurrentFrame

SBJoker 07.04.2011 19:28

Ответ: Проблемка с памятью
 
Код создания объектов в студию!

Reizel 07.04.2011 23:10

Ответ: Проблемка с памятью
 
Охх... Крорче:
Код:

Type TTreePro
        Global LIST:TList=CreateList()
        Field IMAGE:TImage
        Field SPEED:Int
        Field COUNT_F:Int
        Field ID:Int
       
        Function GetRandom:TTreePro()
                R=Rand(1,CountList(LIST))
                For T:TTreePro=EachIn LIST
                        C:+1
                        If(C=R) Return T
                Next
        End Function
End Type

Весьма бреадовшный код прототипов деревьев. Парсер читает файл, вычиывает из него параметры дерева, а потом идет сама картинка в формате PNG, просто дописанная по байтам в конец файла. Вот на ее начало я смещаю указатель в файле, и передаю в функцию LoadAnimImage в кач-ве пути (path:Object)

Картинка грузится верно.

Вот код деревьев:

Код:

Type TTree Extends TObject
        Field PRO:TTreePro 'Вот наш линк на прототип
        Field Timer:Int
        Field CurrentFrame:Int=0
       
        Function Create(X#,Y#,Pro:TTreePro)
                If(PRO=Null) Return
                T:TTree=New TTree
                T.X=X
                T.Y=Y
                T.NEED_INDEXED=0 'нам не нужна индексация в секторах!
                T.RENDER_SIZE=Max(PRO.IMAGE.Width,PRO.IMAGE.Height)
                T.PRO=PRO
                ListAddLast FULL_LIST,T
        End Function
       
        Method Math()
                timer:+1
                If(Timer>PRO.Speed)
                        Timer=0
                        CurrentFrame:+1
                        If(CurrentFrame=PRO.COUNT_F) CurrentFrame=0
                EndIf
        End Method
       
        Method Draw()
                DrawImage PRO.IMAGE,X,Y,CurrentFrame
        End Method
       
        Method Destroy()
        End Method
End Type


SBJoker 07.04.2011 23:57

Ответ: Проблемка с памятью
 
Вот те совет избегай называть параметры так же как члены класса. Экранирование локальными переменными может здорово попортить кровь.

В предоставленном коде вроде бы как всё норм.
А с чего ты решил что память жрёт, т.е. оно же должно если память течёт хавать постоянно... если же однократное увеличение то это просто аллокейшн включая память на будущее.

Reizel 08.04.2011 00:24

Ответ: Проблемка с памятью
 
Ну..Ты знаешь, скачок с 58 мегов до полгига оперативы за рисование одной картинки, это слишком... Тем более глюкает при этом неслабо. Где то все же происходит утечка, блин:(

Reizel 08.04.2011 09:37

Ответ: Проблемка с памятью
 
Забыл совсем сказать. Картинки дерева - анимированные. 100 кадров О_о. размером [300х300 px примерно.
В PNG оно занимает 5 метров диска. А в оперативе, когда развернется, и того наверно больше. Но ведь он ее предварительно загрузил, какого фига он начинает отжирать память при рисовании то????

SBJoker 08.04.2011 11:07

Ответ: Проблемка с памятью
 
ну тогда ты попал, 300х300 в памяти станет 512*512, 512*512*100*4 = 100 мегов как минимум.

Reizel 08.04.2011 11:15

Ответ: Проблемка с памятью
 
ТОгда не будет деревьев анимированных в игре :(

SBJoker 08.04.2011 11:34

Ответ: Проблемка с памятью
 
может чуть меньше фреймов? или в требованиях указать 2гб RAM минимум

Reizel 08.04.2011 11:49

Ответ: Проблемка с памятью
 
2 ГБ RAM для 4-х видов деревьев? Не, лучше уж тогда сделать их статическими. Хотя движок поддерживает любое кол-во фреймов...
Надо попробовать кадров 10 сделать. И картинку пожать.

SBJoker 08.04.2011 11:55

Ответ: Проблемка с памятью
 
кадры 256*256 сократят потери в 4 раза например.

Reizel 08.04.2011 12:02

Ответ: Проблемка с памятью
 
Хыхы :) Сделал-таки 16 кадров. Заметна покадровость, но пофиг. Жрет теперь 58 мегов по максимуму. Тока косячок - движок рисует только то, что находится в пределах экрана. Т.е. пока деревья вдалеке, они не рисуются. Но как начинаю подходить - пару секунд подтормаживает (при этом хавает ~ 16 MB) а потом уже все ОК.
Т.е. это уже мне не исправить, это есть косяк блица, и после загрузки надо тупо прорисовать все кадры всех деревьев, чтоб они потом не лагали. Ща будет тест
[UPD]
ПРорисовав все кадры всех деревьев после загрузки медии перестало лагать. Всем спасибо :)

moka 08.04.2011 15:00

Ответ: Проблемка с памятью
 
Совет насчёт кадров 256x256 - дельный. Плюс подбери размер самой текстуры, максимально квадратный. Если 16 кадров, то вся текстура будет 1024х1024 - что сильно снизит затраты на видео память.

SBJoker 08.04.2011 15:15

Ответ: Проблемка с памятью
 
В Бмаксе квадратным должен быть именно кадр, т.к. текстура физически режется на более мелкие, размер исходной текстуры значения не имеет.


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

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