0
\$\begingroup\$

I wanted to know if using a single Sprite object to render all 2D textures on screen is better than using one sprite for each 2D texture in performance.

EDIT: Using single sprite refers to using a single ID3DXSprite Object to render all textures.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ Your title is super misleading. ID3DXSprite keeps a list of instructions on how to draw sprites so it can draw them at a later time. ID3DXSprite is not a sprite or a texture. \$\endgroup\$ Commented Aug 29, 2014 at 17:20

2 Answers 2

1
\$\begingroup\$

ID3DXSprite is an object designed to help manage drawing sprites efficiently. There is no reason to have more than one ID3DXSprite object. If you need different options for different sprites then use multiple Begin/End groups.

The reason you shouldn't have more than one is because of how ID3DXSprite interacts with the device.

  • Begin: Prepares a device for drawing sprites.
  • Draw: Adds a sprite to the list of batched sprites.
  • End: Calls ID3DXSprite::Flush and restores the device state to how it was before ID3DXSprite::Begin was called.

As you can see Begin and End alter the device state. Having more than one Begin/End active would break the built in device state management, so if you're going to have only one begin/end combo then there is no point in multiple ID3DXSprites.

\$\endgroup\$
0
\$\begingroup\$

If you mean, you want to lay out multiple subtextures onto one big texture, then yes there are advantages to that. This technique is called a "Texture Atlas".

The first advantage is that you will end up with less resource files in your project. For example, if you want to texture the six faces of a cube with different textures, you'd end up with 6 texture images. By packing all into a single texture atlas and using corrected UVs, you can pack them in a single file. The performance benefit is that you need less file access operations when loading resources in your game.

A second advantage is that you need less swapping of textures when rendering your game. In the worst case scenario, every subtexture is bound to a different texture in memory. You'd need to swap textures for every object being rendered, causing overhead.

In case of sprites (such as in old video games), the individual sprites are often layed out on a grid. Every sprite often corresponds to a different pose of the animation. In this case, the term "Sprite Sheet" is often used instead of "Texture Atlas". The concept is the same however.

Two particularities need to be taken into account though. First, you want to make sure that the subtextures you pack into a single texture are relevant. This means, that if one of the subtextures is used, it should be likely for other subtextures on the same sheet to be used. Otherwise you lose the advantage of less texture swapping.

Second, when using linear filtering, mipmapping or anisotropic mipmapping, bleeding effects can occur. This means that sprites will blend with the edges of neighbouring sprites. To solve this problem, add a small margin around your subtextures when packing them into an atlas or sheet. It can also be beneficial to reduce the level of mipmaps generated.

So in brief, packing multiple subtextures into a single texture is an excellent idea! If artifacts such as edge bleeding were to occur, add a small margin around the subtextures.

\$\endgroup\$
3
  • \$\begingroup\$ Actually that's not what I am asking. I realize I should add more detail to me question. Please look at the edit I make now. \$\endgroup\$ Commented Jun 30, 2014 at 10:31
  • \$\begingroup\$ Oh, I see. I'm not familiar with the ID3DXSprite objects, so can't help with that I'm afraid. \$\endgroup\$ Commented Jun 30, 2014 at 10:49
  • \$\begingroup\$ It was a nice answer on how to texture atlas though. \$\endgroup\$ Commented Jun 30, 2014 at 11:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .