internal static void UpdateLog()
        {
            if (!MetricsEnabled)
            {
                return;
            }
            if (pending.Count == 0)
            {
                return;
            }

            InitFile();
            bool loop = true;

            do
            {
                var p = pending.Peek();
                if (p[p.Length - 1].IsReady())
                {
                    var m = new GenericMeasurement()
                    {
                        CPUTimestamp                    = DateTime.Now.Ticks - start_ticks,
                        Elapsed                         = p[0].Read(),
                        Timestamp                       = p[0].Timestamp(),
                        VerticesSubmitted               = p[1].Read(),
                        PrimitivesSubmitted             = p[2].Read(),
                        VertexShaderInvocations         = p[3].Read(),
                        TessControlPatches              = p[4].Read(),
                        TessEvalInvocations             = p[5].Read(),
                        GeometryShaderInvocations       = p[6].Read(),
                        GeometryShaderPrimitivesEmitted = p[7].Read(),
                        FragmentShaderInvocations       = p[8].Read(),
                        ComputeShaderInvocations        = p[9].Read(),
                        ClippingInputPrimitives         = p[10].Read(),
                        ClippingOutputPrimitives        = p[11].Read()
                    };

                    var hdr    = "";
                    var fields = typeof(GenericMeasurement).GetFields();
                    for (int i = 0; i < fields.Length; i++)
                    {
                        hdr += (long)fields[i].GetValue(m) + ",";
                    }
                    hdr = hdr.Substring(0, hdr.Length - 1);
                    logFile.WriteLine(hdr);
                    logFile.Flush();

                    pending.Dequeue();
                    loop = true;
                }
                else
                {
                    loop = false;
                }
                if (pending.Count == 0)
                {
                    loop = false;
                }
            } while (loop);
        }
        public static void EndFrame()
        {
            if (!MetricsEnabled)
            {
                return;
            }
            InitFile();
            var m = new GenericMeasurement()
            {
                CPUTimestamp = DateTime.Now.Ticks - start_ticks,
                Elapsed      = -1
            };
            var hdr    = "";
            var fields = typeof(GenericMeasurement).GetFields();

            for (int i = 0; i < fields.Length; i++)
            {
                hdr += (long)fields[i].GetValue(m) + ",";
            }
            hdr = hdr.Substring(0, hdr.Length - 1);
            logFile.WriteLine(hdr);
            logFile.Flush();
        }