private static void Verify(GameObject sender, EventArgs args, string eventName, bool recursiveSender = false, bool recursiveArgs = true)
        {
            if (!Directory.Exists(Program.ResultPath))
            {
                Directory.CreateDirectory(Program.ResultPath);
            }

            using (var writer = File.CreateText(Path.Combine(Program.ResultPath, eventName + ".txt")))
            {
                using (var analyzer = new GameObjectDiagnosis(sender, writer))
                {
                    var stopwatch = new Stopwatch();
                    stopwatch.Start();
                    analyzer.Analyze(sender, true, recursiveSender);
                    analyzer.Analyze(args, false, recursiveArgs);
                    stopwatch.Stop();
                    Logger.Log(LogLevel.Debug, "Total analyze time of {0}<{2}> (including disk IO): {1}ms", eventName, stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerMillisecond,
                               sender.GetType().Name);

                    var times = analyzer.ComputeTimes.OrderByDescending(o => o.Key).ToArray();
                    if (times.Length > 0)
                    {
                        writer.WriteLine();
                        writer.WriteLine();
                        writer.WriteLine("Top {0} compute times:", Math.Min(10, times.Length));
                        for (var i = 0; i < Math.Min(10, times.Length); i++)
                        {
                            writer.WriteLine(" - {0}: {1}ms", times[i].Value, times[i].Key);
                        }
                    }
                }
            }
        }
        private static void Verify(GameObject sender, EventArgs args, string eventName, bool recursiveSender = false, bool recursiveArgs = true)
        {
            if (!Directory.Exists(Program.ResultPath))
            {
                Directory.CreateDirectory(Program.ResultPath);
            }

            using (var writer = File.CreateText(Path.Combine(Program.ResultPath, eventName + ".txt")))
            {
                using (var analyzer = new GameObjectDiagnosis(sender, writer))
                {
                    var stopwatch = new Stopwatch();
                    stopwatch.Start();
                    analyzer.Analyze(sender, true, recursiveSender);
                    analyzer.Analyze(args, false, recursiveArgs);
                    stopwatch.Stop();
                    Logger.Log(LogLevel.Debug, "Total analyze time of {0}<{2}> (including disk IO): {1}ms", eventName, stopwatch.ElapsedTicks / (double) TimeSpan.TicksPerMillisecond,
                        sender.GetType().Name);

                    var times = analyzer.ComputeTimes.OrderByDescending(o => o.Key).ToArray();
                    if (times.Length > 0)
                    {
                        writer.WriteLine();
                        writer.WriteLine();
                        writer.WriteLine("Top {0} compute times:", Math.Min(10, times.Length));
                        for (var i = 0; i < Math.Min(10, times.Length); i++)
                        {
                            writer.WriteLine(" - {0}: {1}ms", times[i].Value, times[i].Key);
                        }
                    }
                }
            }
        }
        private static void VerifyObjects()
        {
            var currentlyEnabled = GetCurrentlyEnabled();
            var objects          = ObjectManager.Get <GameObject>().Where(o => currentlyEnabled.Contains(o.Type)).ToArray();

            if (objects.Length > 0)
            {
                if (!Directory.Exists(Program.ResultPath))
                {
                    Directory.CreateDirectory(Program.ResultPath);
                }

                using (var writer = File.CreateText(Path.Combine(Program.ResultPath, "PropertyDiagnosis.txt")))
                {
                    writer.WriteLine("Verifying a total of {0} GameObjects!", objects.Length);
                    writer.WriteLine();
                    writer.Flush();

                    var times = new Dictionary <double, string>();

                    foreach (var obj in objects)
                    {
                        using (var analyzer = new GameObjectDiagnosis(obj, writer))
                        {
                            analyzer.Analyze();
                            foreach (var time in analyzer.ComputeTimes)
                            {
                                times[time.Key] = time.Value;
                            }
                        }
                    }

                    var computeResults = new List <AnalyzeComputeResult>();
                    foreach (var time in times)
                    {
                        if (computeResults.All(o => o.Property != time.Value))
                        {
                            computeResults.Add(new AnalyzeComputeResult
                            {
                                Property = time.Value,
                                All      = new List <double> {
                                    time.Key
                                }
                            });
                        }
                        else
                        {
                            computeResults.First(o => o.Property == time.Value).All.Add(time.Key);
                        }
                    }

                    var orderedTimes = computeResults.OrderByDescending(o => o.Average).ToArray();
                    if (orderedTimes.Length > 0)
                    {
                        writer.WriteLine();
                        writer.WriteLine();
                        writer.WriteLine("Top {0} compute times:", Math.Min(100, orderedTimes.Length));
                        for (var i = 0; i < Math.Min(100, orderedTimes.Length); i++)
                        {
                            writer.WriteLine(" - {0}:", orderedTimes[i].Property);
                            writer.WriteLine("     - Average: {0}", orderedTimes[i].Average);
                            writer.WriteLine("     - Min:     {0}", orderedTimes[i].Min);
                            writer.WriteLine("     - Max:     {0}", orderedTimes[i].Max);
                            writer.WriteLine("     - Amount:  {0}", orderedTimes[i].Amount);
                        }
                    }
                }
            }
        }
        private static void VerifyObjects()
        {
            var currentlyEnabled = GetCurrentlyEnabled();
            var objects = ObjectManager.Get<GameObject>().Where(o => currentlyEnabled.Contains(o.Type)).ToArray();
            if (objects.Length > 0)
            {
                if (!Directory.Exists(Program.ResultPath))
                {
                    Directory.CreateDirectory(Program.ResultPath);
                }

                using (var writer = File.CreateText(Path.Combine(Program.ResultPath, "PropertyDiagnosis.txt")))
                {
                    writer.WriteLine("Verifying a total of {0} GameObjects!", objects.Length);
                    writer.WriteLine();
                    writer.Flush();

                    var times = new Dictionary<double, string>();

                    foreach (var obj in objects)
                    {
                        using (var analyzer = new GameObjectDiagnosis(obj, writer))
                        {
                            analyzer.Analyze();
                            foreach (var time in analyzer.ComputeTimes)
                            {
                                times[time.Key] = time.Value;
                            }
                        }
                    }

                    var computeResults = new List<AnalyzeComputeResult>();
                    foreach (var time in times)
                    {
                        if (computeResults.All(o => o.Property != time.Value))
                        {
                            computeResults.Add(new AnalyzeComputeResult
                            {
                                Property = time.Value,
                                All = new List<double> { time.Key }
                            });
                        }
                        else
                        {
                            computeResults.First(o => o.Property == time.Value).All.Add(time.Key);
                        }
                    }

                    var orderedTimes = computeResults.OrderByDescending(o => o.Average).ToArray();
                    if (orderedTimes.Length > 0)
                    {
                        writer.WriteLine();
                        writer.WriteLine();
                        writer.WriteLine("Top {0} compute times:", Math.Min(100, orderedTimes.Length));
                        for (var i = 0; i < Math.Min(100, orderedTimes.Length); i++)
                        {
                            writer.WriteLine(" - {0}:", orderedTimes[i].Property);
                            writer.WriteLine("     - Average: {0}", orderedTimes[i].Average);
                            writer.WriteLine("     - Min:     {0}", orderedTimes[i].Min);
                            writer.WriteLine("     - Max:     {0}", orderedTimes[i].Max);
                            writer.WriteLine("     - Amount:  {0}", orderedTimes[i].Amount);
                        }
                    }
                }
            }
        }