Add profiler code
This commit is contained in:
@@ -16,5 +16,6 @@ types/unitgroup.lua
|
||||
types/unitframe.lua
|
||||
|
||||
frames.lua
|
||||
profiler.lua
|
||||
|
||||
init.lua
|
||||
|
@@ -18,7 +18,8 @@ local AddonName, omif = ...
|
||||
omif.events = {} -- event (str) to list of handlers
|
||||
omif.db = nil
|
||||
|
||||
omif.modules = {}
|
||||
OmicronFrames = {}
|
||||
omif.modules = {public=OmicronFrames}
|
||||
-- Simple function that creates or returns a local module table
|
||||
function omif.GetModule(name)
|
||||
if omif.modules[name] == nil then
|
||||
|
110
src/profiler.lua
Normal file
110
src/profiler.lua
Normal file
@@ -0,0 +1,110 @@
|
||||
-- Copyright 2023 <omicron.me@protonmail.com>
|
||||
--
|
||||
-- This file is part of Omicron Frames
|
||||
--
|
||||
-- Omicron Frames is free software: you can redistribute it and/or modify it
|
||||
-- under the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 3 of the License, or (at your option)
|
||||
-- any later version.
|
||||
--
|
||||
-- Omicron Frames is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
-- more details.
|
||||
--
|
||||
-- You should have received a copy of the GNU General Public License along with
|
||||
-- Omicron Frames. If not, see <https://www.gnu.org/licenses/>.
|
||||
local addonName, omi = ...
|
||||
|
||||
local public = omi.GetModule("public")
|
||||
local types = omi.GetModule("types")
|
||||
local data = {}
|
||||
|
||||
function public.StartProfiler()
|
||||
local profiler = C_CVar.GetCVar("scriptProfile")
|
||||
if profiler ~= "1" then
|
||||
print("scriptProfiler is off", profiler)
|
||||
print("set it to on with `/console scriptProfile 1`, then reload the UI.")
|
||||
return
|
||||
end
|
||||
print("OmicronFrames: start profiling")
|
||||
ResetCPUUsage()
|
||||
end
|
||||
|
||||
function public.StopProfiler()
|
||||
print("OmicronFrames: stop profiling")
|
||||
UpdateAddOnCPUUsage()
|
||||
local total = GetAddOnCPUUsage(addonName)
|
||||
data = {{
|
||||
name = "Total OmicronFrames time",
|
||||
time = total,
|
||||
pct = 1.0
|
||||
}}
|
||||
|
||||
for typeName, T in pairs(types) do
|
||||
if type(T) == "table" then
|
||||
for fnName, fn in pairs(T) do
|
||||
if type(fn) == "function" then
|
||||
local time = GetFunctionCPUUsage(fn, true)
|
||||
table.insert(data, {
|
||||
name = string.format("%s:%s", typeName, fnName),
|
||||
time = time,
|
||||
pct = time/total
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
table.sort(data, function(a, b) return a.time > b.time end)
|
||||
end
|
||||
|
||||
local profileFrame
|
||||
local profileText
|
||||
|
||||
function public.PrintProfilerData()
|
||||
profileFrame:Show()
|
||||
profileText:SetText("")
|
||||
for _, item in ipairs(data) do
|
||||
local line = string.format("% 5.1f%% % 5fms %s\n", item.pct*100, item.time, item.name)
|
||||
profileText:Insert(line)
|
||||
end
|
||||
profileText:SetFocus()
|
||||
end
|
||||
|
||||
local function CreateProfileFrame()
|
||||
profileFrame = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
|
||||
local frame = profileFrame
|
||||
frame.backdropInfo = {
|
||||
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true,
|
||||
tileEdge = true,
|
||||
tileSize = 8,
|
||||
edgeSize = 8,
|
||||
insets = { left = 1, right = 1, top = 1, bottom = 1 },
|
||||
}
|
||||
|
||||
-- Output wrap
|
||||
frame:ApplyBackdrop()
|
||||
frame:SetBackdropColor(0, 0, 0, 1)
|
||||
frame:SetSize(640, 480)
|
||||
frame:SetPoint("TOPRIGHT")
|
||||
frame:SetFrameStrata("DIALOG")
|
||||
frame:Hide()
|
||||
|
||||
local scrollFrame = CreateFrame("ScrollFrame", nil, frame, "UIPanelScrollFrameTemplate")
|
||||
scrollFrame:SetSize(640-16-20, 480-16)
|
||||
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 8, -8)
|
||||
|
||||
profileText = CreateFrame("EditBox", nil, scrollFrame)
|
||||
profileText:SetFontObject(ChatFontNormal)
|
||||
profileText:SetWidth(640-16-20)
|
||||
profileText:SetMultiLine(true)
|
||||
profileText:SetAutoFocus(false)
|
||||
scrollFrame:SetScrollChild(profileText)
|
||||
|
||||
profileText:SetScript("OnEscapePressed", function(self)
|
||||
frame:Hide()
|
||||
end)
|
||||
end
|
||||
omi.SetEventHandler("OMICRON_LOADING", CreateProfileFrame)
|
Reference in New Issue
Block a user