public static SystemInfoSnapshot Deserialize(byte[] input)
        {
            if (input == null || input.Length == 0)
                return null;

            SystemInfoSnapshot result = new SystemInfoSnapshot();
            ComposedByteStream stream = ComposedByteStream.FromByteArray(input);
            if (stream == null)
                return null;

            long[] lS = stream.ReadNextStream<long>();
            result.gcTotalSize = lS[0];
            result.usedHeapSize = lS[1];

            result.memoryProfiled = BitConverter.ToBoolean(stream.ReadNextStream<byte>(), 0);
            int[] iS = stream.ReadNextStream<int>();
            result.runtimeMemory = iS[0];
            result.activeTextures = iS[1];
            result.activeTextureMemory = iS[2];
            result.activeRenderTextures = iS[3];
            result.activeRenderTextureMemory = iS[4];
            result.activeMaterials = iS[5];
            result.activeMaterialsMemory = iS[6];
            result.activeMeshes = iS[7];
            result.activeMeshMemory = iS[8];
            result.activeAnimations = iS[9];
            result.activeAnimationMemory = iS[10];
            result.activeAudioClips = iS[11];
            result.activeAudioClipMemory = iS[12];

            float[] fS = stream.ReadNextStream<float>();
            result.updateFps = fS[0];
            result.fixedFps = fS[1];
            result.averageUpdateFps = fS[2];

            stream.Dispose();
            return result;
        }
        //--------------- Serialize / Deserialize --------------------
        public static byte[] Serialize(SystemInfoSnapshot ss)
        {
            ComposedByteStream stream = ComposedByteStream.FetchStream();
            stream.AddStream(new long[] {
                ss.gcTotalSize,
                ss.usedHeapSize
            });

            stream.AddStream(BitConverter.GetBytes(ss.memoryProfiled));
            stream.AddStream(new int[] {
                ss.runtimeMemory,
                ss.activeTextures,
                ss.activeTextureMemory,
                ss.activeRenderTextures,
                ss.activeRenderTextureMemory,
                ss.activeMaterials,
                ss.activeMaterialsMemory,
                ss.activeMeshes,
                ss.activeMeshMemory,
                ss.activeAnimations,
                ss.activeAnimationMemory,
                ss.activeAudioClips,
                ss.activeAudioClipMemory
            });

            stream.AddStream(new float[] {
                ss.updateFps,
                ss.fixedFps,
                ss.averageUpdateFps
            });

            return stream.Compose();
        }
        //Todo:Add material data and make all dispose calls recursive.
        public override void Dispose()
        {
            base.Dispose();

            if (header != null) header.Dispose();
            if (systemInfo != null) systemInfo.Dispose();
            if (debugLogs != null) debugLogs.Dispose();
            if (humanInput != null) humanInput.Dispose();
            if (meshData != null) meshData.Dispose();
            if (particleData != null) particleData.Dispose();
            if (materialData != null) materialData.Dispose();
            if (gameObjectsSnapshot != null) gameObjectsSnapshot.Dispose();

            header = null;
            systemInfo = null;
            debugLogs = null;
            humanInput = null;
            meshData = null;
            particleData = null;
            materialData = null;
            gameObjectsSnapshot = null;
            screenCapture = null;
        }