Major slowdown creating more than 600 particles.

BlitzMax Forums/BlitzMax Beginners Area/Major slowdown creating more than 600 particles.

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

I found your problem. You were calling the recycle method for each star, but there's also a loop for each star in the method. So for 400 stars you were doing 120000 interations! I do also think your aliens are also suffering from a similar situation.

Just put a call to the recycle method inside the loop in the update function and remove it from your main loop.

Here's the changes I made:

[code]
Strict
'image made global within type: slight speed increase
'star list global within type: very lisght speed increase

Const GR_WIDTH = 1024, GR_HEIGHT = 768, DEPTH = 16, HERTZ = 60

Graphics GR_WIDTH,GR_HEIGHT,DEPTH,HERTZ

SetMaskColor 255,0,255


Type star

	Field xpos:Int
	Field ypos:Int
	Field speed:Int
	Global starImg:TImage
	Global starlist:TList
	Global num_stars
	Global max_stars

	Function create_star()
		num_stars = 0
		max_stars = 500
		starlist=CreateList()
		For Local x:Int = 0 To max_stars-1
			Local s:star = New star
			ListAddLast starlist,(s)
			s.xpos = rnd(0,GR_WIDTH)
			s.ypos = Rand(-1,-GR_HEIGHT)
			s.speed = Rand(2,15)
			num_stars:+1
		Next
		
		'create star image
		SetColor 255,0,255
		DrawRect(0,0,3,3)
		SetColor 255,255,255
		Plot 1,0
		Plot 0,1	
		Plot 1,1
		Plot 2,1
		Plot 1,2
		starImg=CreateImage(3,3)
		GrabImage(starImg,0,0)	
		
	End Function
	
	Function update_stars()
	
		For Local s:star = EachIn starlist
		
			s.ypos:+s.speed
			s.recycle_star()
			s.draw_star()
			
		Next
		
	End Function
	
	Method draw_star()
		DrawImage starImg,xpos,ypos,0
	End Method
	
	Method recycle_star()
		If ypos > GR_HEIGHT Then ypos = -1
	End Method
	
End Type

Const TARGET:Int=60
Local frames:Int=0
star.create_star()
Local frameTime:Int
Local totalTime:Int=0
Local tCounter:Int=0
Repeat
	frameTime=MilliSecs()
	Cls
		SetColor 255,255,255
		star.update_stars()
		DrawRect 0,0,160,28
		SetColor 0,0,0
		DrawText TARGET+" Frames:"+totalTime+"ms",0,12
		DrawText "Stars:"+star.num_stars,0,0
		tCounter:+(MilliSecs()-frameTime)
		If frames=TARGET Then
			totalTime=tCounter
			frames=0
			tCounter=0
		Else
			frames:+1
		EndIf
	FlushMem
	Flip
	
Until KeyHit(KEY_ESCAPE)