---------------------------------------------------------------------------------------
-- NxTimer - Timers and profiling
-- Copyright 2007-2012 Carbon Based Creations, LLC
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
-- Carbonite - Addon for World of Warcraft(tm)
-- Copyright 2007-2012 Carbon Based Creations, LLC
--
-- This program 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.
--
-- This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
---------------------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Generic timer
function Nx.Timer:Init()
self.Data = {}
self:ProfilerInit()
end
--------
-- Start a timer
function Nx.Timer:Start (name, time, user, func)
-- Nx.prt ("Timer Start %s %d", name, time)
if not self.Data[name] then
self.Data[name] = {}
end
local tm = self.Data[name]
tm.T = time
tm.U = user
tm.F = func
return tm
end
--------
-- Stop a timer
function Nx.Timer:Stop (name)
-- Nx.prt ("Timer Stop %s", name)
self.Data[name] = nil
end
--------
-- Set timer user function
function Nx.Timer:SetFunc (name, func)
if self.Data[name] then
self.Data[name].F = func
end
end
--------
-- Check if timer active
function Nx.Timer:IsActive (name)
return self.Data[name]
end
--------
-- Get timer time remaining
function Nx.Timer:Time (name)
if self.Data[name] then
return self.Data[name].T
end
end
--------
-- Generic update
function Nx.Timer:OnUpdate (elapsed)
-- if elapsed > .5 then
-- Nx.prt ("Timer update %f", elapsed)
-- end
elapsed = min (elapsed, .5)
for name, tm in pairs (self.Data) do
tm.T = tm.T - elapsed
if tm.T <= 0 then
-- Nx.prt ("Timer %s", name)
-- local mem = collectgarbage ("count")
if tm.F then
tm.T = tm.F (tm.U, name, tm)
end
-- mem = collectgarbage ("count") - mem
-- if mem > 0 then
-- Nx.prt ("Tm garbage %s %f", name, mem)
-- end
if not tm.T then
self.Data[name] = nil
end
end
end
self:ProfilerOnUpdate()
end
--------
-- Force timer to fire
function Nx.Timer:Fire (name)
local tm = self.Data[name]
if tm then
if tm.F then
tm.T = tm.F (tm.U, name, tm)
end
if not tm.T then
self.Data[name] = nil
end
end
end
-------------------------------------------------------------------------------
function Nx.Timer.Win:Open()
--PAIDS!
if Nx.Free then
return
end
local win = self.Win
if win then
if win:IsShown() then
win:Show (false)
else
win:Show()
end
return
end
--PAIDE!
end
-------------------------------------------------------------------------------
-- Profiler
function Nx.Timer:ProfilerInit()
self.Profiles = {}
self.RunTime = GetTime()
end
function Nx.Timer:ProfilerOnUpdate()
--[[
for _, pro in ipairs (self.Profiles) do
if pro.Reset then
pro.LastCnt = pro.Cnt
pro.Cnt = 0
end
end
--]]
end
function Nx.Timer:ProfilerStart (name, reset)
local pro = self.Profiles[name]
if not pro then
pro = {}
self.Profiles[name] = pro
tinsert (self.Profiles, pro)
pro.Name = name
pro.Time = 0
pro.TimeLast = 0
pro.Cnt = 0
pro.Reset = reset
end
pro.Start = GetTime()
pro.Cnt = pro.Cnt + 1
end
function Nx.Timer:ProfilerEnd (name)
local pro = self.Profiles[name]
assert (pro)
pro.TimeLast = GetTime() - pro.Start
pro.Time = pro.Time + pro.TimeLast
end
--------
-- Get last profile time
function Nx.Timer:ProfilerGetLastTime (name)
local pro = self.Profiles[name]
return pro and pro.TimeLast or 0
end
--------
function Nx.Timer:ProfilerDump()
sort (self.Profiles, function (a, b) return a.Name < b.Name end)
Nx.prt ("Profiler: FPS %.0f", GetFramerate())
for _, pro in ipairs (self.Profiles) do
Nx.prt (" %s %.4f %.4f avrg, #%s, %.3f tot", pro.Name, pro.TimeLast, pro.Time / pro.Cnt, pro.Cnt, pro.Time)
--[[
if pro.LastCnt then
Nx.prt (" #%s", pro.LastCnt)
end
--]]
end
Nx.prt ("Run time %.0f", GetTime() - self.RunTime)
end
-------------------------------------------------------------------------------
-- EOF