Ah, I wish I'd seen this reply an hour ago. Lol.
Anyway, the basic effect isn't too system killing. I knocked this very simple example up:
rem simple tracer program
setvirtualresolution(1280,720)
// set this to 60 to see it running at a nice speed - might use it myself!
setsyncrate(0,1)
// create 250 "blank" sprites, size them and colour them
for a=1 to 250
createsprite(a,0)
setspritesize(a,16,16)
setspritecolor(a,155,155,255,0)
next a
// create an array for the emiters: 1=xpos, 2=ypos, 3=dist to move before turning, 4=direction to move (1=up, 2=right, 3=down, 4=left)
dim emits[5,4]
// set up these sprites and define random starting values
for a=251 to 255
createsprite(a,0)
setspritecolor(a,155,155,255,255)
setspritesize(a,16,16)
setspriteposition(a,emitx,emity)
emits[a-250,1]=random(0,1264)
emits[a-250,2]=random(0,704)
emits[a-250,3]=10+random(0,5)
emits[a-250,4]=random(1,4)
next a
// these two just work out the average FPS
framecount=0
avefps=0
// the 5 emiters each have 50 sprites, this tells the code which of the 50 sprites for each emiter to place by the emiter and refresh
activepart=0
do
// update the five emiters
for a=1 to 5
if emits[a,4]=1
emits[a,2]=emits[a,2]-16
if emits[a,2]<0
emits[a,2]=0
emits[a,4]=random(1,4)
if emits[a,4]=1 then emits[a,4]=2
emits[a,3]=10+random(0,5)
endif
endif
if emits[a,4]=2
emits[a,1]=emits[a,1]+16
if emits[a,1]>1264
emits[a,1]=1264
emits[a,4]=random(1,4)
if emits[a,4]=2 then emits[a,4]=3
emits[a,3]=10+random(0,5)
endif
endif
if emits[a,4]=3
emits[a,2]=emits[a,2]+16
if emits[a,2]>704
emits[a,2]=704
emits[a,4]=random(1,4)
if emits[a,4]=3 then emits[a,4]=4
emits[a,3]=10+random(0,5)
endif
endif
if emits[a,4]=4
emits[a,1]=emits[a,1]-16
if emits[a,1]<0
emits[a,1]=0
emits[a,4]=random(1,4)
if emits[a,4]=4 then emits[a,4]=1
emits[a,3]=10+random(0,5)
endif
endif
emits[a,3]=emits[a,3]-1
for b=1 to 5
setspriteposition(b+250,emits[b,1],emits[b,2])
if emits[b,3]=0
emits[b,3]=10+random(0,5)
emits[b,4]=random(1,4)
endif
next b
next a
// increase particle number being updated, looping over if needed. These are then placed where the emiter for that "chain" of particles is, before it is moved
activepart=activepart+1
if activepart=50 then activepart=1
setspriteposition(activepart,getspritex(251),getspritey(251))
setspriteposition(activepart+50,getspritex(252),getspritey(252))
setspriteposition(activepart+100,getspritex(253),getspritey(253))
setspriteposition(activepart+150,getspritex(254),getspritey(254))
setspriteposition(activepart+200,getspritex(255),getspritey(255))
setspritecolor(activepart,150,150,255,255)
setspritecolor(activepart+50,150,150,255,255)
setspritecolor(activepart+100,150,150,255,255)
setspritecolor(activepart+150,150,150,255,255)
setspritecolor(activepart+200,150,150,255,255)
// update all particles
for b=1 to 250
temp=getspritecoloralpha(b)
if temp>5 then setspritecoloralpha(b,temp-5)
next b
framecount=framecount+1
avefps=avefps+screenfps()
print("Screen FPS :"+str(avefps/framecount))
sync()
loop
On my PC this gets about 1'900 FPS, and my mobile device (perhaps not surprisingly) returns a constant and smooth 60FPS (it's can't go above this due to Android screen syncing). If you change the sync rate to 60 it looks ok I think. It's also quite nice if you drop the sync rate to 60, then add a check to make it only update once every 3rd frame as in the attached .exe - I think that is a good speed myself, and would allow easy staggering of more than 5 strands.