If it weren’t for the recording it’d be 60 FPS at 5100 sprites. Using 256×256 images instead, I get 550 before 60 FPS drops. This is 1920×1080 with 1280×720 projection, so these 16×16 sprites are really drawn around 24×24 and the 256×256 sprites are drawn using 384×384 pixels.
EDIT: this is a new example for the next version, press up/down to increase/decrease the number of sprites.
EDIT2: I think the 16×16 sprites one is bound by the CPU running the language itself. I tried a faster GPU/slower CPU machine, and I get 1400 256×256 sprites but fewer than 5000 16×16. Here is the code:
EDIT3: with current optimisations, I’ve got it at over 5500 sprites at 60 FPS
const SCR_W 1280 SCR_H 720
resize SCR_W SCR_H
var img
= img (image_load "bingo.png")
var w h
explode (image_size img) w h
var font
= font (font_load "font.ttf" 64 1)
var imgs
call spawn
function spawn
{
var v dx dy
= dx (rand 0 1)
= dy (rand 0 1)
if (== dx 0) neg_dx
= dx -1
:neg_dx
if (== dy 0) neg_dy
= dy -1
:neg_dy
vector_init v (rand (/ w 2) (- SCR_W (/ w 2))) (rand (/ h 2) (- SCR_H (/ h 2))) dx dy
vector_add imgs v
}
function draw
{
var sz i
= sz (vector_size imgs)
image_start img
for i 0 (< i sz) 1 next
image_draw img 255 255 255 255 (- [imgs i 0] (/ w 2)) (- [imgs i 1] (/ h 2))
:next
image_end img
font_draw font 255 255 0 255 (string_format "%" sz) 5 5
}
function run
{
var sz i
= sz (vector_size imgs)
for i 0 (< i sz) 1 next
= [imgs i 0] (+ [imgs i 0] [imgs i 2])
= [imgs i 1] (+ [imgs i 1] [imgs i 3])
if (< [imgs i 0] (/ w 2)) pos_x (< [imgs i 1] (/ h 2)) pos_y (> [imgs i 0] (- SCR_W (/ w 2))) neg_x (> [imgs i 1] (- SCR_H (/ h 2))) neg_y
= [imgs i 0] (/ w 2)
= [imgs i 2] (neg [imgs i 2])
:pos_x
= [imgs i 1] (/ h 2)
= [imgs i 3] (neg [imgs i 3])
:pos_y
= [imgs i 0] (- SCR_W (/ w 2))
= [imgs i 2] (neg [imgs i 2])
:neg_x
= [imgs i 1] (- SCR_H (/ h 2))
= [imgs i 3] (neg [imgs i 3])
:neg_y
:next
}
function event type a b c d
{
if (== type EVENT_KEY_DOWN) key
if (== a KEY_UP) up (&& (== a KEY_DOWN) (> (vector_size imgs) 1)) down
call spawn
:up
vector_erase imgs (- (vector_size imgs) 1)
:down
:key
}

Leave a Reply