static HarmonyPatches()
        {
            harmonyInstance = HarmonyInstance.Create("rimworld.gguake.profiler");
            ProfilePatcher.Patch(harmonyInstance, typeof(Game), AccessTools.Method(typeof(Game), "UpdatePlay"));

            harmonyInstance.Patch(AccessTools.Method(typeof(DebugWindowsOpener), "DevToolStarterOnGUI"),
                                  postfix: new HarmonyMethod(typeof(HarmonyPatches), nameof(DevToolStarterOnGUIPostfix)));

            Log.Message("profiler init");
        }
        public override void DoWindowContents(Rect inRect)
        {
            inRect    = inRect.ContractedBy(8f);
            Text.Font = GameFont.Tiny;
            GUI.BeginGroup(inRect);

            typeMethodName = Widgets.TextField(new Rect(0f, 0f, 400f, 30f), typeMethodName);

            if (Widgets.ButtonText(new Rect(410f, 0f, 120f, 30f), "Profile"))
            {
                int    i         = typeMethodName.LastIndexOf('.');
                string typeStr   = typeMethodName.Substring(0, i);
                string methodStr = typeMethodName.Substring(i + 1);
                Type   type      = AccessTools.TypeByName(typeStr);
                if (type == null)
                {
                    Log.Error(string.Format("Type {0} is not exist.", typeStr));
                }

                MethodInfo methodInfo = AccessTools.Method(type, methodStr);
                if (methodInfo == null)
                {
                    Log.Error(string.Format("Method {0}.{1} is not exist.", typeStr, methodStr));
                }

                ProfilePatcher.Patch(HarmonyPatches.harmonyInstance, type, methodInfo);
            }


            List <TabRecord> tabList = new List <TabRecord>();

            foreach (string key in ProfilerManager.GetTargets())
            {
                tabList.Add(new TabRecord(key, delegate()
                {
                    scrollPosition    = Vector2.zero;
                    currentProfileKey = key;
                }, currentProfileKey == key));
            }

            if (currentProfileKey == null && ProfilerManager.GetTargets().Count() > 0)
            {
                currentProfileKey = ProfilerManager.GetTargets().First();
            }

            TabDrawer.DrawTabs(new Rect(0f, 70f, 560f, 330f), tabList);
            if (currentProfileKey != null)
            {
                int  count          = ProfilerManager.GetMethods(currentProfileKey).Count();
                Rect scrollOutRect  = new Rect(0f, 90f, 560f, 320f);
                Rect scrollViewRect = new Rect(0f, 0f, 550f, count * 22f);

                float y = 0f;
                Widgets.BeginScrollView(scrollOutRect, ref scrollPosition, scrollViewRect, true);

                foreach (string method in ProfilerManager.GetMethods(currentProfileKey))
                {
                    long currentTick = ProfilerManager.GetProfileData(currentProfileKey, method).Max();

                    Widgets.Label(new Rect(0f, y, 420f, 22f), method);
                    Widgets.Label(new Rect(420f, y, 80f, 22f), currentTick.ToString());

                    y += 22f;
                }
                Widgets.EndScrollView();
            }

            GUI.EndGroup();
            Text.Font = GameFont.Small;
        }