So far, I've been pretty happy with Google Protocol Buffers when it comes to serializing game resources. However, one can do much better performance-wise if willing to sacrifice some flexibility. What can be faster than to eliminate the process of serialization completely by using the same data structures for both: runtime and storage, then it is possible just to mem-copy your objects around with no additional memory allocations and serialization overhead.

If you know your target platform, you can design such data structures quite easily. In general, it means to get rid of pointers and replace them with offsets, and also be aware of endianness, alignment and padding rules. By using 32-bit offsets, alignment and padding, your data effectively becomes 32-bit wide, perfectly suited for both: 32-bit and 64-bit code running over it.

In the runtime it's convenient to introduce a lightweight wrapper class that maps a BLOB into something more useful with a regular interface (I call the wrappers 'reference types'). Such a wrapper is very cheap to create and copy as it doesn't contain any data (it only refers it). This kind of anti-OOP approach proves to be more and more relevant to me.

On the content side, Python's ctypes module can be conveniently used to transform various intermediate formats into BLOBs with a binary layout matching the runtime. It's where the flexibility of Python meets the power of C++!

The two examples below show how a PNG texture can be transformed into a BLOB (Python) and then manipulated in the runtime (C++11):