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) The MIT License (MIT)
Copyright (c) 2015 devfirefly Copyright (c) 2015 devfirefly
Some modifications copyright (c) 2017 Guard13007
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal 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, 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 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@ -37,7 +37,15 @@ currently reworking it.
Pie:mousepressed(...) Pie:mousepressed(...)
end 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 # Keys
@ -49,7 +57,7 @@ up = decreases depth
down = increases depth down = increases depth
- = decreases step size \- = decreases step size
= = increases step size = = increases step size

View File

@ -60,3 +60,13 @@ end
function love.mousepressed(...) function love.mousepressed(...)
profiler:mousepressed(...) profiler:mousepressed(...)
end 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,8 +1,12 @@
local path = ... local path = ...
local piefiller = {} local piefiller = {}
local function hsvToRgb(h, s, v) local function hsvToRgb(h, s, v)
local h,s,v = h,1,1 local i, f, p, q, t, r, g, b -- was polluting with globals
local h,s,v = math.fmod(h,360),s,v
-- local h,s,v = h,1,1 -- was ignoring s/v values entirely
h = math.fmod(h, 360)
if s == 0 then return {v, v, v} end if s == 0 then return {v, v, v} end
h=h/60 h=h/60
i=math.floor(h) i=math.floor(h)
@ -24,6 +28,7 @@ local function hsvToRgb(h, s, v)
b = b * 255 b = b * 255
return {r, g, b} return {r, g, b}
end end
local function copy(t) local function copy(t)
local ret = {} local ret = {}
for i,v in pairs(t) do for i,v in pairs(t) do
@ -34,12 +39,20 @@ local function copy(t)
end end
return ret return ret
end end
function setColor(...)
local function setColor(...) -- was global
local args = {...} 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 end
-- TODO verify these do not break if using multiple profilers
local color_data = {} 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() function piefiller:new()
local self = {} local self = {}
setmetatable( self, {__index = piefiller} ) setmetatable( self, {__index = piefiller} )
@ -47,7 +60,6 @@ function piefiller:new()
self.parsed = {} self.parsed = {}
self.last = 0 self.last = 0
self.timer = 0 self.timer = 0
self:reset()
self.depth = 2 self.depth = 2
self.small = false self.small = false
self.x = 0 self.x = 0
@ -58,34 +70,36 @@ function piefiller:new()
reset = "r", reset = "r",
increase_depth = "down", increase_depth = "down",
decrease_depth = "up", decrease_depth = "up",
increase_step_size = ",", -- TODO changing step_size should trigger a reset (by default, make it optional), because else the data is invalid
decrease_step_size = ".", increase_step_size = "=", -- changed default to "+" button
shorten_names = "s", decrease_step_size = "-", -- changed default to "-" button
show_hidden = "c", shorten_names = "z", -- changed default (based on assumption WASD is common control scheme)
save_to_file = "p", 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 return self
end end
function piefiller:reset() function piefiller:reset()
self.data = {} self.data = {}
-- why should these be reset? only the data matters
self.x = 0 self.x = 0
self.y = 0 self.y = 0
self.scale = 1 self.scale = 1
for i=0,300 do
table.insert(colors,hsvToRgb(i,100,100))
end end
end
function piefiller:setKey(table_or_mode,key) function piefiller:setKey(table_or_command,key)
if type(table_or_mode) == "table" then if type(table_or_command) == "table" then
self.keys = table_or_mode self.keys = table_or_command
for i,v in pairs(table_or_mode) do for i,v in pairs(table_or_command) do
if self.keys[i] then self.keys[i] = v end if self.keys[i] then self.keys[i] = v end
end end
elseif type(table_or_mode) == "string" then elseif type(table_or_command) == "string" then
if not self.keys[table_or_mode] then error("Invalid mode: "..tostring(table_or_mode)) end if not self.keys[table_or_command] then error("Invalid command: "..tostring(table_or_command)) end
self.keys[table_or_mode] = key self.keys[table_or_command] = key
else else
error("Expected table or string got:"..type(table_or_mode)) error("Expected table or string, got: "..type(table_or_command))
end end
end end
@ -103,8 +117,10 @@ function piefiller:parse(caller,parent)
kids = {}, kids = {},
} }
end end
function piefiller:attach() function piefiller:attach()
self.last = os.clock() self.last = os.clock()
local function hook() local function hook()
local depth = self.depth local depth = self.depth
local caller = debug.getinfo(depth) local caller = debug.getinfo(depth)
@ -140,16 +156,20 @@ function piefiller:attach()
end end
end end
end end
local step = 10^self.step local step = 10^self.step
if self.step < 0 then if self.step < 0 then
step = 1/-self.step step = 1/-self.step
end end
debug.sethook(hook, "", step) debug.sethook(hook, "", step)
end end
function piefiller:detach(stop)
function piefiller:detach(stop) -- TODO figure out what stop is useful for
local totaltime = 0 local totaltime = 0
local parsed = {} local parsed = {}
local no = 0 local no = 0
for i,v in pairs(self.data) do for i,v in pairs(self.data) do
no = no + 1 no = no + 1
totaltime = totaltime + v.time totaltime = totaltime + v.time
@ -162,6 +182,7 @@ function piefiller:detach(stop)
parsed[i].cur = v.info.currentline parsed[i].cur = v.info.currentline
parsed[i].item = v parsed[i].item = v
parsed[i].caller = v.info parsed[i].caller = v.info
if not color_data[v.func] then if not color_data[v.func] then
local i = math.random(#colors) local i = math.random(#colors)
color_data[v.func] = colors[i] color_data[v.func] = colors[i]
@ -170,22 +191,26 @@ function piefiller:detach(stop)
parsed[i].color = color_data[v.func] parsed[i].color = color_data[v.func]
end end
local prc = totaltime/100 local prc = totaltime/100
for i,v in ipairs(parsed) do for i,v in ipairs(parsed) do
parsed[i].prc = v.time/prc parsed[i].prc = v.time/prc
end end
self.parsed = parsed self.parsed = parsed
self.totaltime = totaltime self.totaltime = totaltime
if not stop then debug.sethook() end if not stop then debug.sethook() end
end end
local largeFont = love.graphics.newFont(25) local largeFont = love.graphics.newFont(25)
function piefiller:draw(args) function piefiller:draw(args)
local loading local loading
local oldFont = love.graphics.getFont() local oldFont = love.graphics.getFont()
local args = args or {} local args = args or {}
local rad = args["rad"] or 200 local rad = args.rad or 200
local mode = args["mode"] or "simple" -- these weren't even being used
local ret = args["return"] -- local mode = args["mode"] or "simple"
-- local ret = args["return"]
local pi = math.pi local pi = math.pi
local arc = love.graphics.arc local arc = love.graphics.arc
local w,h = love.graphics.getDimensions() local w,h = love.graphics.getDimensions()
@ -198,22 +223,24 @@ function piefiller:draw(args)
if self.parsed and self.totaltime > 0 then if self.parsed and self.totaltime > 0 then
local lastangle = 0 local lastangle = 0
local font = love.graphics.getFont() local font = love.graphics.getFont()
for i,v in ipairs(self.parsed) do for i,v in ipairs(self.parsed) do
local color = v.color local color = v.color
local cx,cy = w/2,h/2 local cx,cy = w/2,h/2
local angle = math.rad(3.6*v.prc) local angle = math.rad(3.6*v.prc)
setColor(color) setColor(color)
arc("fill",cx,cy,rad,lastangle,lastangle + angle) arc("fill",cx,cy,rad,lastangle,lastangle + angle)
setColor(colors.black) -- setColor(colors.black) -- not defined, actually needs to be white
setColor(255, 255, 255, 255)
if v.prc > 1 then if v.prc > 1 then
arc("line",cx,cy,rad,lastangle,lastangle + angle) arc("line",cx,cy,rad,lastangle,lastangle + angle)
end end
lastangle = lastangle + angle lastangle = lastangle + angle
setColor() setColor()
end end
lastangle = 0 lastangle = 0
for i,v in ipairs(self.parsed) do for i,v in ipairs(self.parsed) do
local color = v.color local color = v.color
local cx,cy = w/2,h/2 local cx,cy = w/2,h/2
local angle = math.rad(3.6*v.prc) local angle = math.rad(3.6*v.prc)
@ -242,10 +269,12 @@ function piefiller:draw(args)
else else
loading = true loading = true
end end
self.timer = self.timer + love.timer.getDelta() self.timer = self.timer + love.timer.getDelta()
if self.timer > 20 then if self.timer > 20 then
self.timer = 0 self.timer = 0
end end
love.graphics.setFont(largeFont) love.graphics.setFont(largeFont)
local t = "Depth: "..self.depth.." with step: "..self.step local t = "Depth: "..self.depth.." with step: "..self.step
local fw = largeFont:getWidth(t) local fw = largeFont:getWidth(t)
@ -261,6 +290,7 @@ function piefiller:draw(args)
love.graphics.setFont(oldFont) love.graphics.setFont(oldFont)
end end
function piefiller:mousepressed(x,y,b) function piefiller:mousepressed(x,y,b)
if b == "wu" then if b == "wu" then
local scale = self.scale - math.floor((0.05*self.scale)*1000)/1000 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 end
end end
function piefiller:keypressed(key) function piefiller:keypressed(key)
local mode local command
for i,v in pairs(self.keys) do for i,v in pairs(self.keys) do
if key == v then if key == v then
mode = i command = i
break break
end end
end end
if mode then if command then
if mode == "reset" then if command == "reset" then
self:reset() self:reset()
elseif mode == "increase_depth" then elseif command == "increase_depth" then
self:reset() self:reset()
self.depth = self.depth + 1 self.depth = self.depth + 1
elseif mode == "decrease_depth" then elseif command == "decrease_depth" then
self:reset() self:reset()
self.depth = self.depth - 1 self.depth = self.depth - 1
elseif mode == "increase_step_size" then elseif command == "increase_step_size" then
self.step = self.step - 1 self.step = self.step - 1
elseif mode == "decrease_step_size" then elseif command == "decrease_step_size" then
self.step = self.step +1 self.step = self.step +1
elseif mode == "shorten_names" then elseif command == "shorten_names" then
self.small = not self.small self.small = not self.small
elseif mode == "show_hidden" then elseif command == "show_hidden" then
self:reset() self:reset()
self.view_children = not self.view_children self.view_children = not self.view_children
elseif mode == "save_to_file" then elseif command == "save_to_file" then
local parsed = copy(self.parsed) local parsed = copy(self.parsed)
table.sort(parsed,function(a,b) table.sort(parsed,function(a,b)
return a.prc > b.prc return a.prc > b.prc
@ -341,11 +372,12 @@ function piefiller:keypressed(key)
table.insert(d,table.concat(instance)) table.insert(d,table.concat(instance))
end end
local data = table.concat(d) local data = table.concat(d)
love.filesystem.write("Profile",data) love.filesystem.write("Profile.txt",data)
love.system.openURL(love.filesystem.getRealDirectory("Profile")) love.system.openURL(love.filesystem.getRealDirectory("Profile.txt"))
end end
end end
end end
function piefiller:unpack(fn) function piefiller:unpack(fn)
local data = { local data = {
items = {}, items = {},
@ -355,6 +387,7 @@ function piefiller:unpack(fn)
totalTime = self.totaltime, totalTime = self.totaltime,
}, },
} }
for i,v in ipairs(self.parsed) do for i,v in ipairs(self.parsed) do
local a = { local a = {
name = v.name, name = v.name,
@ -366,11 +399,12 @@ function piefiller:unpack(fn)
caller = v.caller, caller = v.caller,
} }
if fn then if fn then
assert(type(fn) == "function","Expected function got:"..type(fn)) assert(type(fn) == "function", "Expected function, got: "..type(fn))
fn(a) fn(a)
end end
table.insert(data.items, a) table.insert(data.items, a)
end end
return data return data
end end
return piefiller return piefiller