forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   TAnimImage (http://forum.boolean.name/showthread.php?t=3685)

jimon 18.06.2007 23:01

TAnimImage
 
простой тип для автоматической анимации анимированых картинок
мне понадобился чтобы везде не заморачиватся с кодом

в типе сделано фпс независимая реализация
потому даже со стабилизацией фпс заморачиватся не стоит

Код:

Type TAnimImage
       
        Field AnimationSpeed# ' in milisec per frame  , for example 1000/12 or 1000/25
        Field Image:TImage
        Field LastAnimationTime#
        Field Frame#
        Field StartCell%
        Field CellCount%
       
        Method Free()
                Image = Null
        End Method

        Method Draw(x#,y#,fr% = -1)
                If fr <> - 1 Then Frame = fr
               
                DrawImage Image,x,y,Frame
               
                If ( MilliSecs() - LastAnimationTime) => AnimationSpeed  Then
                        Frame:+ (Float(MilliSecs() - LastAnimationTime))/AnimationSpeed
                        LastAnimationTime = MilliSecs()
                        If Frame >= CellCount Then Frame = StartCell
                End If
        End Method
       
        Function CreateAnimImage:TAnimImage(Img:TImage,Speed#,StartCell%,CellCount%)
                Local AnImg:TAnimImage = New TAnimImage
               
                AnImg.AnimationSpeed = 1000.0 / Speed
                AnImg.Image = Img
                AnImg.LastAnimationTime = MilliSecs()
                AnImg.StartCell = StartCell
                AnImg.CellCount = CellCount
                AnImg.Frame = StartCell
               
                Return AnImg
        End Function


End Type


примерный код как использовать (писал просто в браузере)
Код:

' 25 - ето 25 кадров в секунду
Img:TAnimImage = TAnimImage.CreateAnimImage(our_img,25,0,10)

while not keyhit(key_escape)
cls
Img.Draw(0,0)
flip
wend

Img.Free()
Img = Null

ps. я решил использовать свой метод Free для того чтобы избежать
потери памяти на кросслинках

moka 19.06.2007 01:19

Re: TAnimImage
 
Цитата:

Image = Null
Если не загружаешь картинку каждый раз, а присваиваешь к переменной хандл картинки, создаётся копия, или просто "указатель"?

SBJoker 19.06.2007 02:36

Re: TAnimImage
 
правильней написать так:
Код:

Method Delete() 'стандартный деструктор вызываемый при удалении объекта
    Image = Null
End Method

'поэтому в программе чтобы удалить объект достаточно написать
img=Null 'а деструктор Delete вызовется автоматически.\


johnk 19.06.2007 02:36

Re: TAnimImage
 
Указатель, вроде.

jimon 19.06.2007 10:39

Re: TAnimImage
 
SBJoker
такой метод у меня дал течь в виндовском менеджере ... хотя блицовский манагер молчал ... потому пришлось принимать меры ..

MoKa
указатель

SBJoker 19.06.2007 13:17

Re: TAnimImage
 
Хех, течь у него, а ты GCollect вызывал? Вот именно, что нет значит сборщик мусора отложил это на дальнюю перспективу..

jimon 19.06.2007 13:21

SBJoker
щитаеш меня за идиота ? естествено что вызывал :)
иначе бы память во внутренем манагере прыгала
а так она оставалась всегда константой ...
а память в виндовском манагере откровенно текла

ну вот смотри ... и обьсяни тогда мои наблюдения :

тестовый код
Код:

Framework brl.GLMax2D
Import BRL.PNGLoader
Import brl.jpgloader

Type TResourceImage
        Field Image:TImage
       
        Method Delete()
                DebugLog "eta hren tozhe vizivaetsa ! "
                Image = Null
        End Method
       
        Function LoadResource:TResourceImage(file$)
                Local Res:TResourceImage = New TResourceImage
                Res.Image = LoadImage(file)
                Return Res
        End Function
End Type

Global ResourceManager:TResourceManager

Type TResourceManager

        Field Resources:TList
       
        Method Delete()
                DebugLog "eta hren vizivaetsa ! "
                Resources.Clear()
                Resources = Null
        End Method
       
        Method CreateNewResource(File$)
                Local Res:TResourceImage
                Res = TResourceImage.LoadResource(File)
                Resources.AddLast Res
        End Method
       
        Method LoadResources()
                CreateNewResource("circlefont.png")
        End Method
       
        Function CreateResourceManager()
                ResourceManager = New TResourceManager
                ResourceManager.Resources = New TList
        End Function

End Type



Graphics 100,100

GCCollect()

While Not KeyHit(KEY_ESCAPE) Or AppTerminate()

TResourceManager.CreateResourceManager()
GCCollect()
ResourceManager.LoadResources()
GCCollect()
ResourceManager = Null
GCCollect()

DebugLog GCMemAlloced()

Wend
End

память во внутренем манагере не течет
нажимаем ctrl+alt+del и смотрим там скока ета тварь жрет памяти
оказывается что жрет по наростающей ...

коментируем строчку Import brl.jpgloader
пробуем опять, память не течет ... вопрос какого хрена ?!

ps. как потом оказалось ... :) (я ету проблемму пару дней тому назад решал)
что собстенно методы Delete \ Free не решают етой проблеммы
так что принципиально я использую Free чтобы избавится от кросслинков

alcoSHoLiK 19.06.2007 15:10

Re: TAnimImage
 
Там какая-то течь была с PNG загрузчиком.


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

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