public VisibleRecord ReadVisibleRecord(Stream dlisStream)
        {
            if (dlisStream == null)
            {
                return(null);
            }

            var visibleRecord = new VisibleRecord
            {
                Length = _unormReader.ReadUNORM(dlisStream),
                FormatVersionField1 = _ushortReader.ReadUSHORT(dlisStream),
                FormatVersionField2 = _ushortReader.ReadUSHORT(dlisStream)
            };

            if (visibleRecord.FormatVersionField1 != 255 || visibleRecord.FormatVersionField2 != 1)
            {
                throw new Exception("invalid visible record format");
            }

            var logicalRecordSegmentData = dlisStream.ReadBytes(visibleRecord.Length - 4);

            if (logicalRecordSegmentData == null)
            {
                throw new Exception("invalid visible record length");
            }

            var logicalRecordSegments = new List <LogicalRecordSegment>();

            using (var lrsStream = new MemoryStream(logicalRecordSegmentData))
            {
                while (!lrsStream.IsAtEndOfStream())
                {
                    var lrs = _logicalRecordSegmentBusiness.ReadLogicalRecordSegment(lrsStream);
                    if (lrs == null)
                    {
                        throw new Exception("invalid logical record segment");
                    }
                    logicalRecordSegments.Add(lrs);
                }
            }
            visibleRecord.Segments = logicalRecordSegments.ToArray();

            return(visibleRecord);
        }
        public static string RecordVisibleRenderers()
        {
            Camera cam = Camera.main;

            if (cam == null)
            {
                return("Can't find main camera");
            }

            VisibleRecord record = new VisibleRecord();

            record.fps          = 1f / Time.deltaTime;
            record.batches      = RuntimeStats.batches;
            record.setPassCalls = RuntimeStats.setPassCalls;
            record.tris         = RuntimeStats.triangles;
            record.verts        = RuntimeStats.vertices;
            record.camPos       = cam.transform.position;
            record.camDir       = cam.transform.forward;
            record.camUp        = cam.transform.up;
            record.camFov       = cam.fieldOfView;
            record.camNear      = cam.nearClipPlane;
            record.camFar       = cam.farClipPlane;
            record.camOc        = cam.useOcclusionCulling ? 1 : 0;
            record.camHdr       = cam.allowHDR ? 1 : 0;
            record.camMsaa      = cam.allowMSAA ? 1 : 0;

            record.renders = new List <string>();
            var mrs = FindObjectsOfType <MeshRenderer>();

            foreach (MeshRenderer mr in mrs)
            {
                if (mr != null && mr.isVisible)
                {
                    string    path     = mr.name;
                    Transform parentTr = mr.transform.parent;
                    while (parentTr != null)
                    {
                        path     = parentTr.name + "/" + path;
                        parentTr = parentTr.parent;
                    }
                    path = mr.gameObject.scene.name + "/" + path;

                    int        vert = 0, tris = 0;
                    MeshFilter mf = mr.GetComponent <MeshFilter>();
                    if (mf != null && mf.sharedMesh != null)
                    {
                        vert = mf.sharedMesh.vertexCount;
                        tris = mf.sharedMesh.triangles.Length;
                    }
                    Vector3 pos = mr.transform.position;

                    path += string.Format("=>vert:{0},tris:{1},pos:{2}", vert, tris, pos);

                    record.renders.Add(path);
                }
            }

            string json = JsonUtility.ToJson(record);
            var    now  = System.DateTime.Now;

            System.IO.File.WriteAllText(string.Format("visible-{0}-{1}-{2}-{3}.json", now.Month, now.Day, now.Hour, now.Minute), json);

            return("OK");
        }