Why are these textures taking up so much memory..

Someone on the newsgroups was recently asking why loading his simple 800x600 texture was taking up so much memory (more than 5 megs).  He was using code something like the following:

Texture myTexture = TextureLoader.FromFile(myDevice, somePath);

The quest seemed interesting enough for me to post my response here as well as in the newsgroup since this reinforces my belief that you should always know what the methods you're calling 'cost'.  It wouldn't surprise me to find out that most people don't realize all the things that go in with that simple line above.

So here was my response:

First, if you're texture is really 800x600, using this overload (TextureLoader.FromFile) will 'upscale' the texture so that it is square and a power of two, in this case, 1024x1024..  Assuming 32bit color for each pixel, the default mip level would be:

1024x1024x4 = 4 megs of pixel data.

 

Now, this overload would also create a mipmap chain down to 1x1, so you would also have:

512x512x4 = 1 meg of pixel data

256x256x4 = 256k of pixel data

128x128x4 = 64k of pixel data

64x64x4 = 16k of pixel data

32x32x4 = 4k of pixel data

16x16x4 = 1k of pixel data

8x8x4 = 256 bytes of pixel data

4x4x4 = 64 bytes of pixel data

2x2x4 = 16 bytes of pixel data

1x1x4 = 4 bytes of pixel data

 

 

So, add it all up, and each texture you load would take (on average) 5.6 megs of pixel data..  So the numbers make sense to me..