Flushmem may not be working?

BlitzMax Forums/BlitzMax Programming/Flushmem may not be working?

ziggy(Posted 2005) [#1]
I have this little program:

------------------------------------------------------

Strict

'STANDAR TYPE FOR ALL GRAPHICAL OBJECTS:
Type Base Abstract
Global Elements:Int
Field X:Float
Field Y:Float
Method New()
'EVERYTIME A GRAPHICAL OBJECT IS CREATED; IT IS COUNTED:
Elements:+1
End Method
End Type


'EVERY STAR IS AN OBJECT:
Type Star Extends Base 'IT EXTENDS BASE BECOUSE IT IS A GRAPHICAL OBJECT
Field Speed:Float 'EVERY STAR HAS ITS OWN SPEED
Field Parent:Sky 'EVERY STAR IS ALLOCATED INSIDE AN SKY OBJECT
Field ColorIntensity:Int

Method New()
Speed = Rand(1001,1020)/1000.0 'WHEN A STAR IS CREATED, A RANDOM SPEED IS ASSIGNED TO IT
ColorIntensity = Rand(105,255)
x=Rand(0,GraphicsWidth()) 'IT IS PLACED ON THE SCREEN
y=Rand(0,GraphicsHeight())
End Method


Method Move() 'THIS IS CALLED TO MOVE STARS.
Local OldX,OldY
OldX = X
OldY = Y
' self.x=(self.x-GraphicsWidth()/2)*Speed+GraphicsWidth()/2'
' self.y=(self.y-GraphicsHeight()/2)*Speed+GraphicsHeight()/2

self.x=(self.x-MouseX())*Speed+MouseX()
self.y=(self.y-MouseY())*Speed+MouseY()

'IF A STAR IS OUT OF BOUNDS, IT IS DESTROYED
If ((self.x<0) Or (self.x>GraphicsWidth()) Or (self.y<0) Or (self.y>GraphicsHeight()))
parent.DeleteStar(Self)
Else
SetColor(ColorIntensity,ColorIntensity,ColorIntensity)
DrawLine(X,Y,OldX,OldY) 'We draw the star
EndIf
End Method

End Type



Type Sky Extends base
Field Stars: TList 'A LIST OF ALL STARS INSIDE THE SKY
Field StarNum:Int 'THE NUMBER OF STARS THE SKY OBJECT WILL OWN



Method New()
Stars = New TList 'START DE STARS COLLECTION
Local i:Int=0
Starnum = 500
For i=1 To Starnum
addstar()
Next
End Method


Method AddStar()
Local I:Star=New Star 'WE CREATE A NEW STAR
i.parent = Self 'WE TELL THE NEW STAR THIS SKY IS ITS PARENT
Stars.AddLast I 'WE ADD THE NEW STAR IN THE STARS LIST.
End Method

Method Update()
Local Counter:Int = 0 'STAR COUNTER
Local j:Int=0 'FOR - NEXT INDEX
Local i:star 'STAR TYPE DECLARATION
For i:star= EachIn stars 'WE GO THROUG ALL STARS LIST, MOVING EVERY STAR.
Counter:+1
i.move()
Next

i = Null ' WE FREE THE I VARIABLE AND ITS STAR OBJECT.

For j = counter To starnum 'WE CREATE AS MUCH STARS AS NEEDED TO REPOSE THE ONES WHO HAVE DIED.
addstar
Next

End Method

Method DeleteStar(StarToDelete:Star)
Stars.remove (StarToDelete) 'WE REMOVE THE STAR FROM THE COLLECTION
Elements:-1 'UPDATE ELEMENTS COUNTER (ELEMENTS IS INSIDE BASE TYPE DECLARATION AND IT IS ACCESIBLE THROUG ALL OBJECTS THAT EXTEND BASE).
End Method
End Type

Graphics 1024,768
HideMouse
Local mysky:sky=New sky
Local FrameTimer:Float=MilliSecs()
While Not KeyHit(27)
Cls
FlushMem
mysky.update()
DrawOval(MouseX()-5,MouseY()-5,10,10)
'DrawText MemAlloced(), 1,1
While MilliSecs () < FrameTimer + 35
Wend
FrameTimer = MilliSecs ()
Flip
Wend
EndGraphics


'---------------
If i put the FlushMem inside the method Update of the object SKY, FlushMem doesn't do anything. I don't know wht, but it just doesn't do anything, and memAlloced() grows ad grows non stop, but when I put ir in the main loop (where it is now) it works ok. My question is:
WHY?


tonyg(Posted 2005) [#2]
Flushmem needs to be in the mainloop as it releases memory from any 'child' loop. In your program it is only releasing memory freed within that method. There is a thread somewhere which explains it (in the Bug Reports I believe).
Here
Why the hell can't I get this chuffing anchor tags to work???
<edit> FINALLY!!!


FlameDuck(Posted 2005) [#3]
If i put the FlushMem inside the method Update of the object SKY, FlushMem doesn't do anything.
Flushmem only works within the confines of its respective scope.

Thus a Flushmen inside a function or method will only free resources allocated within that function or method, or within functions or methods invoked from that scope.


dynaman(Posted 2005) [#4]
> Flushmem only works within the confines of its respective scope.

I hope that means calling it globally will handle anything lower level that was called. Locals within a procedure for example. (I'm sure this is mentioned in the docs, but it would be an easy oops to make)


tonyg(Posted 2005) [#5]
Dynaman, anything lower is handled. The only reason you may need additional flushmems is if you function does a LOT of work before passing control back to the main loop for the flushmem. Hope that makes sense.


dynaman(Posted 2005) [#6]
Yup - makes sense, it's what I would expect anyway...