"Unfortunately the memory used by this approach quickly turned out to be unmanageable for a volume of any significant size, so I turned to using a sparse data structure like a boost::unordered_map. With this approach, the block x,y,z co-ordinates are packed into a boost::tuple and used as the key to the map and the block properties are stored as a byte."
Try this and see if performance improves for 4 player Big levels.
There is some technique on this page:
http://bytebash.com/2012/03/opengl-volume-rendering/
It uses a format other than arrays,
"Unfortunately the memory used by this approach quickly turned out to be unmanageable for a volume of any significant size, so I turned to using a sparse data structure like a boost::unordered_map. With this approach, the block x,y,z co-ordinates are packed into a boost::tuple and used as the key to the map and the block properties are stored as a byte."
Try this and see if performance improves for 4 player Big levels.