Drawing bitmap fast on ARM Cotex
BSP_LCD_GetXSize() can trivially be moved to outside the loop, but this may not be something that compiler can do, as we know its value will not change.

Can you combine the background and sprite drawing, then several optimisations become possible?
For example you can have an array of bits Ysize in length, that are set to 1 if a sprite occupies that line, otherwise zero, same thing for the X axis, then if a y axis 'there is a sprite somewhere on this line' bit is zero you can just use the DMA to blit the whole line from the background (Or even all the lines until you find a non zero in the Y axis presence flags), if the 'line has a sprite' bit is '1' then you cook the DMA off for the line up to the first sprite, and while the DMA engine is moving the background, do the sprite painting loop for the appropriate line, then cook off the DMA for the next bit of line and so on.
This particular approach only works optimally with am memory mapped screen.

Keeping a sorted list of sprites is helpful as it makes finding the one you need to work on quicker, this also lets you impose an ordering on the sprites so that something reasonable happens when two sprites overlap. 

Keeping a ring of DMA control buffers is very useful as it means you don't need to stop rendering sprites while you wait for the DMA core to complete.

The DMA engine is your friend, slightly tricky to use sometimes, but you really want it doing the constant stuff in the background. 

You really want to be painting to a in memory frame buffer, then  DMA blitting that to the screen during the "VBI" to avoid tearing, not always possible because you don't always have sufficient ram, but nice when you can pull it off. 

There may be some useful stuff in the "Graphics gems" books, probably volume one or two, they are the bible for CPU based 2D stuff.