/ld27

To get this branch, use:
bzr branch /bzr/ld27

« back to all changes in this revision

Viewing changes to zoetrope/debug/performance.lua

  • Committer: Josh C
  • Date: 2014-07-03 14:41:57 UTC
  • Revision ID: josh@9ix.org-20140703144157-xydxt62xzcdq6bdk
cluke009 zoetrope + my spritebatch changes

Show diffs side-by-side

added added

removed removed

 
1
-- Class: DebugPerformance
 
2
-- Shows a live graph of frames per second. This only records data while visible.
 
3
 
 
4
DebugPerformance = DebugInstrument:extend
 
5
{
 
6
        width = 'narrow',
 
7
        contentHeight = 30,
 
8
        samples = {},
 
9
        sampleInterval = 0.25,
 
10
        samplePtr = 1,
 
11
        numSamples = 100,
 
12
        _sampleTimer = 0,
 
13
        average = '-',
 
14
 
 
15
        onNew = function (self)
 
16
                self.bars = self:add(Group:new())
 
17
        end,
 
18
 
 
19
        onUpdate = function (self, elapsed)
 
20
                self._sampleTimer = self._sampleTimer + elapsed
 
21
                local fps = math.floor(1 / elapsed + 0.5)
 
22
                self.title.text = 'FPS (' .. fps .. ', average ' .. self.average .. ')'
 
23
 
 
24
                if self._sampleTimer > self.sampleInterval then
 
25
                        -- record fps and percent of desired fps
 
26
 
 
27
                        table.insert(self.samples, fps)
 
28
                        table.insert(self.samples, fps / the.app.fps)
 
29
 
 
30
                        if #self.samples > self.numSamples * 2 then
 
31
                                table.remove(self.samples, 1)
 
32
                                table.remove(self.samples, 1)
 
33
                        end
 
34
 
 
35
                        -- calculate average
 
36
 
 
37
                        local sum = 0
 
38
 
 
39
                        for i = 1, #self.samples, 2 do
 
40
                                sum = sum + self.samples[i]
 
41
                        end
 
42
 
 
43
                        self.average = math.floor(sum / #self.samples * 2 + 0.5)
 
44
 
 
45
                        -- sync bars and title bar
 
46
 
 
47
                        local barHeight = self.contentHeight - 2 * self.spacing
 
48
 
 
49
                        for i, bar in ipairs(self._sampleBars) do
 
50
                                local percent = self.samples[i * 2]
 
51
 
 
52
                                if percent then
 
53
                                        bar.distort.y = percent
 
54
 
 
55
                                        if percent > 0.5 then
 
56
                                                -- blend yellow to green
 
57
                                                bar.fill = {255 * (1 - (percent / 2)), 255, 0}
 
58
                                        else
 
59
                                                -- blend red to yellow
 
60
                                                -- 510 * percent = 255 * percent / 2
 
61
                                                bar.fill = {255, 510 * percent, 0}
 
62
                                        end
 
63
                                else
 
64
                                        bar.distort.y = 0
 
65
                                end
 
66
                        end
 
67
 
 
68
                        self._sampleTimer = 0
 
69
                end
 
70
        end,
 
71
 
 
72
        onResize = function (self, x, y, width, height)
 
73
                local oldSamples = self.numSamples
 
74
 
 
75
                self.y = y + self.spacing 
 
76
                x = x + self.spacing
 
77
                self.numSamples = math.floor(width - 2 * self.spacing) / 2
 
78
 
 
79
                if self.numSamples ~= oldSamples then
 
80
                        self._sampleBars = {}
 
81
 
 
82
                        while #self.bars.sprites > 0 do
 
83
                                self.bars:remove(self.bars.sprites[1])
 
84
                        end
 
85
 
 
86
                        for i = 1, self.numSamples do
 
87
                                self._sampleBars[i] = self.bars:add(Fill:new
 
88
                                {
 
89
                                        x = x,
 
90
                                        y = self.y,
 
91
                                        width = 2,
 
92
                                        height = height - self.spacing * 2,
 
93
                                        origin = { y = height - self.spacing * 2 },
 
94
                                        distort = { x = 1, y = 0 },
 
95
                                        fill = {255, 255, 255},
 
96
                                })
 
97
 
 
98
                                x = x + 2
 
99
                        end
 
100
                end
 
101
        end
 
102
}