My iOS build of my game Dragons High was using about 150MB of live memory.
I used the Allocations instrument to find out that I had more than 10,000 allocations of the size of 4K Bytes.
All those allocations were of the same class,
In Dragons High there is a terrain of the world. The terrain has collision geometry data.
Basically I test the dragon or other moving characters against the triangles of the terrain geometry so they won’t go through it.
In order to not go over all the triangles I have a grid of lists(
std::deque) with indices to the triangles, so if the character is inside a certain cell in the grid I just test against the triangles in that cell and not against all the triangles in the mesh.
It turns out that for every item in
std::deque was allocating 4K Bytes even if it had less than 20 items.
For my grid I allocated 128×128 cells, so as a result I had more than 50MB usage just for this std::vector.
For every std::deque<unsigned int> in the std::vector in my iOS game I had 4K allocated even if there were very few elements in the std::deque.
My solution was to use my own custom Data Structure which used dynamically allocated
unsigned int * pointer.
This way I was able to shave about 50MB of memory usage.
A better alternative to making your own custom class with a pointer is to use
std::vector takes care of allocations for you, so it’s safer and it does not have a noticeable memory footprint(for a small amount of items).