SFML community forums

Help => Graphics => Topic started by: gsaurus on October 19, 2008, 10:04:58 pm

Title: Strip images
Post by: gsaurus on October 19, 2008, 10:04:58 pm
Hi

How much different would be using one image with much "sub-images", where sprites draws from selecting subrects, instead of using separated images for all these "subimages"?

I did few simple 2D games before (in other APIs and languages), where I had most of the sprites with fixed size (ex: 32x32), so a strip image was fine. This time I have animations which frames have different sizes.

I have to decide if I save separated images with just the needed rectangle on each, or save all in one as a strip image, which may have a lot of junk pixels (because of compensations from different sizes).

I also can try to minimize the junk pixels cropping and joining images by hand or by a dynamic algorithm, (and having a table indicating the coordinates for each one) but I hope to avoid it.
Title: Strip images
Post by: Kreeg on October 19, 2008, 10:40:39 pm
This technique is called clipping and you can use it with SFML. Check out the member of sf::Sprite !
Title: Strip images
Post by: gsaurus on October 20, 2008, 04:26:09 pm
Hm.. What do you mean? What member?

Imagine a fall down animation witch have 2 frames:
Code: [Select]

\o/              
 |    and  =-|o


- I can save the 2 frames horizontally aligned in a unique image, and there will be junk pixels because second pic height is smaller than the first one.
Then a sprite will use setSubRect to have first or second frame (according to the size of each frame, stored somewhere)
Its one image like this:
Code: [Select]

_________
|\o/=-|o|  
| | ####| <--  junk pixels in bottom right
---------


- Alternatively, frames are saved as separated images, without junk pixels, and the sprite will use setImage to have first or second frame.
It's two Images like this:
Code: [Select]

_____        ______
|\o/|   and  |=-|o|
| | |        ------
-----




Thinking that I could have much animations, each one with much frames of different sizes, how different could be the 2 alternatives? Shouldn't I care about the extra memory used to store unused pixels in strip-images? How much better (or not) would be using a big image instead of 50 small ones (for instance)
Title: Strip images
Post by: Wizzard on October 20, 2008, 07:42:21 pm
You can do either and they will have extremely similar performances I'm sure, but using multiple images will likely save you only a couple bytes per frame.
Likewise, using a single image will reduce the amount of time it takes needed to load frames by some milliseconds, but increase the time it takes for switching frames by about a hundredth of a nanosecond.
It's up to your personal preference really, since they don't have any major advantages over the other; I use sprite sheets (or strip images) for my game engine because it's a lot easier to edit a single image than multiple.
Title: Strip images
Post by: gsaurus on October 20, 2008, 08:10:32 pm
Thank you very much!
I'll probably use separated images then.
I'm doing a sprite editor before start with the game engine itself. In that editor, a sprite sheet is loaded and then saved after a little process. So I did this question to decide the best format to save them.

With separated images the size and coordinates table isn't needed also.
So, for each sprite, I receive the sprite sheet, split it into multiple small images and save them all in a data file. This file will be loaded into memory by the game engine, and a vector of images are loaded from that allocated memory.

Edit: interesting, looking at setImage of sf::Sprite code I see that mySubRect isn't adjusted when an image was set before, I always have to call both setImage and setSubRect. Not big issue, but..