lots of tweaks, adding compatibility to 0.10.2

This commit is contained in:
Paul Liverman III 2017-07-26 21:15:05 -07:00
parent 7657f31fd1
commit 6ce2e48317
4 changed files with 198 additions and 146 deletions

View File

@ -1,6 +1,7 @@
The MIT License (MIT)
Copyright (c) 2015 devfirefly
Some modifications copyright (c) 2017 Guard13007
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@ -19,4 +20,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -37,7 +37,15 @@ currently reworking it.
Pie:mousepressed(...)
end
```
5) With sufficient output, press the "E" key to output to file.
5) With sufficient output, press the `E` key to output to file. Example output:
```
-----drawRectangles-----
source:@main.lua:20
current line: 22
time: 548.325
percentage: 98 %
----------------
```
# Keys
@ -49,7 +57,7 @@ up = decreases depth
down = increases depth
- = decreases step size
\- = decreases step size
= = increases step size
@ -95,8 +103,8 @@ piefiller:setKey(table)
# For your own interpretation
If you wish to interpret the data on your own use `piefiller:unpack()`.
Output is a table as such:
If you wish to interpret the data on your own use `piefiller:unpack()`.
Output is a table as such:
```lua
data = {

View File

@ -60,3 +60,13 @@ end
function love.mousepressed(...)
profiler:mousepressed(...)
end
-- temporarily allowing for old behavior in 0.10.2
function love.wheelmoved(x, y)
local X, Y = love.mouse.getPosition()
if y > 0 then
love.mousepressed(X, Y, "wu")
else
love.mousepressed(X, Y, "wd")
end
end

View File

@ -1,29 +1,34 @@
local path = ...
local piefiller = {}
local function hsvToRgb(h, s, v)
local h,s,v = h,1,1
local h,s,v = math.fmod(h,360),s,v
if s==0 then return { v,v,v } end
h=h/60
i=math.floor(h)
f=h-i
p=v*(1-s)
q=v*(1-s*f)
t=v*(1-s*(1-f))
local i, f, p, q, t, r, g, b -- was polluting with globals
if i==0 then r=v g=t b=p
elseif i==1 then r=q g=v b=p
elseif i==2 then r=p g=v b=t
elseif i==3 then r=p g=q b=v
elseif i==4 then r=t g=p b=v
else r=v g=p b=q
end
-- local h,s,v = h,1,1 -- was ignoring s/v values entirely
h = math.fmod(h, 360)
r=r*255
g=g*255
b=b*255
return { r,g,b }
if s == 0 then return {v, v, v} end
h=h/60
i=math.floor(h)
f=h-i
p=v*(1-s)
q=v*(1-s*f)
t=v*(1-s*(1-f))
if i==0 then r=v g=t b=p
elseif i==1 then r=q g=v b=p
elseif i==2 then r=p g=v b=t
elseif i==3 then r=p g=q b=v
elseif i==4 then r=t g=p b=v
else r=v g=p b=q
end
r = r * 255
g = g * 255
b = b * 255
return {r, g, b}
end
local function copy(t)
local ret = {}
for i,v in pairs(t) do
@ -34,58 +39,67 @@ local function copy(t)
end
return ret
end
function setColor(...)
local function setColor(...) -- was global
local args = {...}
love.graphics.setColor(args[1] or 255,args[2] or 255,args[3] or 255,args[4] or 255)
love.graphics.setColor(args[1] or 255, args[2] or 255, args[3] or 255, args[4] or 255)
end
-- TODO verify these do not break if using multiple profilers
local color_data = {}
local colors = {}
local colors = {} -- the pool of available colors is removed from every time a new time is used
for i=0,300 do
table.insert( colors, hsvToRgb(i, 1, 1) )
end
function piefiller:new()
local self = {}
setmetatable(self,{__index = piefiller})
self.data = {}
local self = {}
setmetatable( self, {__index = piefiller} )
self.data = {}
self.parsed = {}
self.last = 0
self.timer = 0
self:reset()
self.depth = 2
self.small = false
self.x = 0
self.y = 0
self.scale = 1
self.step = 1
self.keys = {
self.last = 0
self.timer = 0
self.depth = 2
self.small = false
self.x = 0
self.y = 0
self.scale = 1
self.step = 1
self.keys = {
reset = "r",
increase_depth = "down",
decrease_depth = "up",
increase_step_size = ",",
decrease_step_size = ".",
shorten_names = "s",
show_hidden = "c",
save_to_file = "p",
-- TODO changing step_size should trigger a reset (by default, make it optional), because else the data is invalid
increase_step_size = "=", -- changed default to "+" button
decrease_step_size = "-", -- changed default to "-" button
shorten_names = "z", -- changed default (based on assumption WASD is common control scheme)
show_hidden = "h", -- changed default
save_to_file = "e", -- changed default -> e for export
show_profiler = "p", -- added new control to show/hide the profiler, default p
}
return self
end
function piefiller:reset()
self.data = {}
-- why should these be reset? only the data matters
self.x = 0
self.y = 0
self.scale = 1
for i=0,300 do
table.insert(colors,hsvToRgb(i,100,100))
end
end
function piefiller:setKey(table_or_mode,key)
if type(table_or_mode) == "table" then
self.keys = table_or_mode
for i,v in pairs(table_or_mode) do
function piefiller:setKey(table_or_command,key)
if type(table_or_command) == "table" then
self.keys = table_or_command
for i,v in pairs(table_or_command) do
if self.keys[i] then self.keys[i] = v end
end
elseif type(table_or_mode) == "string" then
if not self.keys[table_or_mode] then error("Invalid mode: "..tostring(table_or_mode)) end
self.keys[table_or_mode] = key
elseif type(table_or_command) == "string" then
if not self.keys[table_or_command] then error("Invalid command: "..tostring(table_or_command)) end
self.keys[table_or_command] = key
else
error("Expected table or string got:"..type(table_or_mode))
error("Expected table or string, got: "..type(table_or_command))
end
end
@ -103,22 +117,24 @@ function piefiller:parse(caller,parent)
kids = {},
}
end
function piefiller:attach()
self.last = os.clock()
local function hook()
local depth = self.depth
local caller = debug.getinfo(depth)
local taken = os.clock() - self.last
self.last = os.clock()
local function hook()
local depth = self.depth
local caller = debug.getinfo(depth)
local taken = os.clock() - self.last
if caller then
local last_caller
local own = string.find(caller.source,path)
local last_caller
local own = string.find(caller.source, path)
if caller.func ~= hook and not own then
while caller do
if last_caller and not self.view_children then
local name = caller.func
local lc = self.data[last_caller.func]
if not lc.kids[name] then
lc.kids[name] = self:parse(caller,last_caller)
lc.kids[name] = self:parse(caller, last_caller)
end
local kid = lc.kids[name]
kid.count = kid.count + 1
@ -127,7 +143,7 @@ function piefiller:attach()
local name = caller.func
local raw = self.data[name]
if not raw then
self.data[name] = self:parse(caller,last_caller)
self.data[name] = self:parse(caller, last_caller)
end
raw = self.data[name]
raw.count = raw.count + 1
@ -139,54 +155,63 @@ function piefiller:attach()
end
end
end
end
end
local step = 10^self.step
if self.step < 0 then
step = 1/-self.step
end
debug.sethook(hook,"",step)
debug.sethook(hook, "", step)
end
function piefiller:detach(stop)
local totaltime = 0
local parsed = {}
local no = 0
for i,v in pairs(self.data) do
no = no + 1
totaltime = totaltime + v.time
local i = no
parsed[i] = {}
parsed[i].name = v.info.name
parsed[i].time = v.time
function piefiller:detach(stop) -- TODO figure out what stop is useful for
local totaltime = 0
local parsed = {}
local no = 0
for i,v in pairs(self.data) do
no = no + 1
totaltime = totaltime + v.time
local i = no
parsed[i] = {}
parsed[i].name = v.info.name
parsed[i].time = v.time
parsed[i].src = v.info.source
parsed[i].def = v.info.linedefined
parsed[i].cur = v.info.currentline
parsed[i].def = v.info.linedefined
parsed[i].cur = v.info.currentline
parsed[i].item = v
parsed[i].caller = v.info
if not color_data[v.func] then
local i = math.random(#colors)
color_data[v.func] = colors[i]
table.remove(colors,i)
table.remove(colors, i)
end
parsed[i].color = color_data[v.func]
end
local prc = totaltime/100
for i,v in ipairs(parsed) do
parsed[i].prc = v.time/prc
end
self.parsed = parsed
self.totaltime = totaltime
local prc = totaltime/100
for i,v in ipairs(parsed) do
parsed[i].prc = v.time/prc
end
self.parsed = parsed
self.totaltime = totaltime
if not stop then debug.sethook() end
end
local largeFont = love.graphics.newFont(25)
function piefiller:draw(args)
local loading
local loading
local oldFont = love.graphics.getFont()
local args = args or {}
local rad = args["rad"] or 200
local mode = args["mode"] or "simple"
local ret = args["return"]
local pi = math.pi
local rad = args.rad or 200
-- these weren't even being used
-- local mode = args["mode"] or "simple"
-- local ret = args["return"]
local pi = math.pi
local arc = love.graphics.arc
local w,h = love.graphics.getDimensions()
@ -196,56 +221,60 @@ function piefiller:draw(args)
love.graphics.scale(self.scale)
if self.parsed and self.totaltime > 0 then
local lastangle = 0
local font = love.graphics.getFont()
local lastangle = 0
local font = love.graphics.getFont()
for i,v in ipairs(self.parsed) do
local color = v.color
local color = v.color
local cx,cy = w/2,h/2
local angle = math.rad(3.6*v.prc)
setColor(color)
arc("fill",cx,cy,rad,lastangle,lastangle + angle)
setColor(colors.black)
if v.prc > 1 then
arc("line",cx,cy,rad,lastangle,lastangle + angle)
end
lastangle = lastangle + angle
setColor()
end
setColor(color)
arc("fill",cx,cy,rad,lastangle,lastangle + angle)
-- setColor(colors.black) -- not defined, actually needs to be white
setColor(255, 255, 255, 255)
if v.prc > 1 then
arc("line",cx,cy,rad,lastangle,lastangle + angle)
end
lastangle = lastangle + angle
setColor()
end
lastangle = 0
for i,v in ipairs(self.parsed) do
local color = v.color
local cx,cy = w/2,h/2
local angle = math.rad(3.6*v.prc)
local x = cx + rad * math.cos(lastangle + angle/2)
local y = cy + rad * math.sin(lastangle + angle/2)
if self.small then
txt = tostring(v.src).." @: "..tostring(v.name)
else
txt = tostring(math.ceil(v.prc)).." % "..tostring(v.name).." : "..tostring(v.src).." @: "..tostring(v.def)
end
local fw = font:getWidth(txt)
local sx = 1
if cx < x then
sx = -1
fw = 0
end
if cy + rad/2 < y then
y = y + font:getHeight()
elseif cy + rad/2 > y then
y = y - font:getHeight()
end
local ofx
love.graphics.print(txt,((x) + (-(fw+20))*sx),y)
lastangle = lastangle + angle
local color = v.color
local cx,cy = w/2,h/2
local angle = math.rad(3.6*v.prc)
local x = cx + rad * math.cos(lastangle + angle/2)
local y = cy + rad * math.sin(lastangle + angle/2)
if self.small then
txt = tostring(v.src).." @: "..tostring(v.name)
else
txt = tostring(math.ceil(v.prc)).." % "..tostring(v.name).." : "..tostring(v.src).." @: "..tostring(v.def)
end
local fw = font:getWidth(txt)
local sx = 1
if cx < x then
sx = -1
fw = 0
end
if cy + rad/2 < y then
y = y + font:getHeight()
elseif cy + rad/2 > y then
y = y - font:getHeight()
end
local ofx
love.graphics.print(txt,((x) + (-(fw+20))*sx),y)
lastangle = lastangle + angle
end
else
loading = true
end
end
self.timer = self.timer + love.timer.getDelta()
if self.timer > 20 then
self.timer = 0
end
love.graphics.setFont(largeFont)
local t = "Depth: "..self.depth.." with step: "..self.step
local fw = largeFont:getWidth(t)
@ -261,6 +290,7 @@ function piefiller:draw(args)
love.graphics.setFont(oldFont)
end
function piefiller:mousepressed(x,y,b)
if b == "wu" then
local scale = self.scale - math.floor((0.05*self.scale)*1000)/1000
@ -293,33 +323,34 @@ function piefiller:mousepressed(x,y,b)
end
end
end
function piefiller:keypressed(key)
local mode
local command
for i,v in pairs(self.keys) do
if key == v then
mode = i
command = i
break
end
end
if mode then
if mode == "reset" then
if command then
if command == "reset" then
self:reset()
elseif mode == "increase_depth" then
elseif command == "increase_depth" then
self:reset()
self.depth = self.depth + 1
elseif mode == "decrease_depth" then
elseif command == "decrease_depth" then
self:reset()
self.depth = self.depth - 1
elseif mode == "increase_step_size" then
elseif command == "increase_step_size" then
self.step = self.step - 1
elseif mode == "decrease_step_size" then
elseif command == "decrease_step_size" then
self.step = self.step +1
elseif mode == "shorten_names" then
elseif command == "shorten_names" then
self.small = not self.small
elseif mode == "show_hidden" then
elseif command == "show_hidden" then
self:reset()
self.view_children = not self.view_children
elseif mode == "save_to_file" then
elseif command == "save_to_file" then
local parsed = copy(self.parsed)
table.sort(parsed,function(a,b)
return a.prc > b.prc
@ -341,11 +372,12 @@ function piefiller:keypressed(key)
table.insert(d,table.concat(instance))
end
local data = table.concat(d)
love.filesystem.write("Profile",data)
love.system.openURL(love.filesystem.getRealDirectory("Profile"))
love.filesystem.write("Profile.txt",data)
love.system.openURL(love.filesystem.getRealDirectory("Profile.txt"))
end
end
end
function piefiller:unpack(fn)
local data = {
items = {},
@ -355,6 +387,7 @@ function piefiller:unpack(fn)
totalTime = self.totaltime,
},
}
for i,v in ipairs(self.parsed) do
local a = {
name = v.name,
@ -366,11 +399,12 @@ function piefiller:unpack(fn)
caller = v.caller,
}
if fn then
assert(type(fn) == "function","Expected function got:"..type(fn))
assert(type(fn) == "function", "Expected function, got: "..type(fn))
fn(a)
end
table.insert(data.items,a)
table.insert(data.items, a)
end
return data
end
return piefiller