Try this. Has extra flags and sync rate to 0. The vsync is already turned on so using sync rate will actually mess up your graphics.
set display mode 1024,768,32,1,0,0
sync on
sync rate 0
Have you tried in different modes if there are differences Windowed/Full/Desktop?
Or you can try posting your codes, maybe the problem is hidden somewhere else in there?
If all still fails you can try the advanced sprite plugin. It's much faster and has more control but also much harder to use.
Run this test and see if it's still laggy. Also try running it with the vsync off.
DisplayX = 1024
DisplayY = 768
set display mode DisplayX,DisplayY,32,1
sync on
sync rate 0
#constant Sprite_Pointer 1
#constant Image_Pointer 10
global ObjectCount = 500
global ObjectFrame = 25
global PlayerID = ObjectCount
dim ObjectX(ObjectCount)
dim ObjectY(ObjectCount)
dim ObjectDr(ObjectCount)
dim ObjectTimer(ObjectCount)
dim ObjectDiff(ObjectCount,2)
dim ObjectFrame(ObjectCount)
for ID = 0 to ObjectCount
ObjectX(ID) = rnd(DisplayX)
ObjectY(ID) = rnd(DisplayY)
ObjectDr(ID) = 0
ObjectTimer(ID) = 0
ObjectDiff(ID,0) = 100+rnd(100)
ObjectDiff(ID,1) = 100+rnd(100)
ObjectDiff(ID,2) = 100+rnd(100)
ObjectFrame(ID) = 0
next ID
REM Turn this off when working in 2D.
backdrop off
REM Creating Image
ImageSize = 64
for lp = 1 to ObjectFrame
cls 0
ink rgb(200,200,200),0
box ImageSize*.3,ImageSize*.3,ImageSize*.7,ImageSize*.7
box ImageSize*.4,ImageSize*.1,ImageSize*.6,ImageSize*.9
ink rgb(255,255,255),0
r = lp
if lp > ObjectFrame/2 then r = ObjectFrame-lp
circle ImageSize/2-1,ImageSize/2-1,r
get image Image_Pointer+lp-1,0,0,ImageSize,ImageSize,1
next lp
Sprite_Mode = 1
do
if spacekey()
if KeyS = 0
if Sprite_Mode = 0 then Sprite_Mode = 1 else Sprite_Mode = 0
if Sprite_Mode = 0
for ID = 1 to ObjectCount
s = Sprite_Pointer+ID
if sprite exist(s) then delete sprite s
next ID
endif
endif
KeyS = 1
else
KeyS = 0
endif
gosub Handle_Object
ink rgb(255,255,255),0
text 0,0,"FPS:"+str$(screen fps())
text 300,0,"Movement: WASD"
text 0,20,"Sprites Amount:"+str$(TotalSprite)
if Sprite_Mode = 0 then text 300,20,"Using: Single Sprite for ALL (Spacekey to Change)"
if Sprite_Mode = 1 then text 300,20,"Using: Individual Sprites (Spacekey to Change)"
sync
cls rgb(100,100,100)
LOOP
REM Movements
Handle_Object:
TotalSprite = 1
for ID = 0 to ObjectCount
if Sprite_Mode = 0 then s = Sprite_Pointer
if Sprite_Mode = 1 then s = Sprite_Pointer+ID : inc TotalSprite
REM Create the sprite if needed
if sprite exist(s) = 0
sprite s,0,0,Image_Pointer
size sprite s,ImageSize,ImageSize
if Sprite_Mode = 0 then hide sprite s
if Sprite_Mode = 1 then show sprite s
endif
if ID = PlayerID
if keystate(17) then dec ObjectY(ID)
if keystate(30) then dec ObjectX(ID)
if keystate(32) then inc ObjectX(ID)
if keystate(31) then inc ObjectY(ID)
set sprite diffuse s,255,255,255
center text ObjectX(ID)+32,ObjectY(ID)-10,str$(ObjectX(ID))+","+str$(ObjectY(ID))
else
dec ObjectTimer(ID)
if ObjectTimer(ID) < 1
ObjectTimer(ID) = 50+rnd(50)
ObjectDr(ID) = rnd(3)
endif
if ObjectDr(ID) = 0 then dec ObjectY(ID)
if ObjectDr(ID) = 1 then dec ObjectX(ID)
if ObjectDr(ID) = 2 then inc ObjectX(ID)
if ObjectDr(ID) = 3 then inc ObjectY(ID)
set sprite diffuse s,ObjectDiff(ID,0),ObjectDiff(ID,1),ObjectDiff(ID,2)
endif
REM Animation
inc ObjectFrame(ID),2
if ObjectFrame(ID) > ObjectFrame*10 then ObjectFrame(ID) = 0
if ObjectX(ID) < 0 then ObjectX(ID) = 0
if ObjectY(ID) < 60 then ObjectY(ID) = 60
if ObjectX(ID) > DisplayX then ObjectX(ID) = DisplayX
if ObjectY(ID) > DisplayY then ObjectY(ID) = DisplayY
if Sprite_Mode = 0
set sprite image s,Image_Pointer + ObjectFrame(ID)/10
hide sprite s
paste sprite s,ObjectX(ID),ObjectY(ID)
endif
if Sprite_Mode = 1
sprite s,ObjectX(ID),ObjectY(ID),Image_Pointer + ObjectFrame(ID)/10
endif
next ID
return
