Issues with sprite engine and cleaning up

SGDK only sub forum

Moderator: Stef

Post Reply
TheGouldFish
Newbie
Posts: 7
Joined: Tue May 08, 2018 7:27 pm

Issues with sprite engine and cleaning up

Post by TheGouldFish » Fri Oct 19, 2018 5:33 pm

Hi,

In my game I've split up the code into states and try to have each state clean up after its self when it ends.
But I've noticed that if I got between two states quite often that I will eventually blow up the Vram, and this seems to be due to sprites.

So I create my sprites using the spr_addsprite inside a sys_disableinterupts and I then clean up inside another set.
I know that I've not missed any as the check the number of active sprites and they have all been cleared.

I've tried cleaning in the order they were created and the reverse order but after a while I will start getting courrpt graphics and compiling in debug I can see it saying there isn't enough vram.

Message : VDP_allocateSprites(12) success: 45 - remaining = 34
Message : VRAM_alloc(115) failed: no enough free VRAM slot (free = 152)


I've also tried to use the SPR_reset, which in some cases seems to slow the issue down but not always.

I'm sure its something stupid that I'm doing, I just have no idea what.

User avatar
Stef
Very interested
Posts: 2959
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Re: Issues with sprite engine and cleaning up

Post by Stef » Sat Oct 20, 2018 12:46 pm

When doing lot of VRAM alloc / release, you end by having fragmented VRAM and that is an issue to allocate a new sprite.
If you use the last version of SGDK from github repository, you may see the new SPR_defragVRAM() method to force VRAM defragmentation operation. You can do it from time to time to ensure your VRAM remains defragmented.
Anohter way of doing if to use SPR_addSpriteSafe(..) or SPR_addSpriteExSafe(..) methods to ass a new sprite instead of classic ones, so if sprite allocation fail, it will do a VRAM defragmentation and retry the allocation.

TheGouldFish
Newbie
Posts: 7
Joined: Tue May 08, 2018 7:27 pm

Re: Issues with sprite engine and cleaning up

Post by TheGouldFish » Sat Oct 20, 2018 4:39 pm

I was working with the last release (134) but I'll give latest another go.
Last time I tried there were lots of compile warnings.

Does doing a SPR_reset clear the vram? and if yes when I call it should I wait for DMA to complete or vsync before adding anymore sprites?

TheGouldFish
Newbie
Posts: 7
Joined: Tue May 08, 2018 7:27 pm

Re: Issues with sprite engine and cleaning up

Post by TheGouldFish » Sat Oct 20, 2018 11:03 pm

After more invetigation it looks like I was trying to do to much as I was getting,
Message : DMA_queueDma(..) warning: transfer size is above 7500 bytes.

which then memory stomped or did something bad as it resulted in messing up the VRAM alloc,
VRAM_free(1056) --> remaining = 35430
(it should have been 384)

I guess I was trying to send too much sprite data over, not how I could split it over to transfers so I just created a number of backgounds which works around the issue.

User avatar
Stef
Very interested
Posts: 2959
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Re: Issues with sprite engine and cleaning up

Post by Stef » Tue Oct 23, 2018 5:21 pm

Glad you fixed your problem but normally exceeding the DMA capacity per frame shouldn't be a big issue (it' just a warning as you can see), at worst you may get some slowdowns.. but allocating too much sprites is an important issue. Logs (that you're using with the debug version of the lib) can help to investigate the problem, normally you should see the error in sprite / vram allocation when they happen...

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest