-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain_loop.lua
More file actions
93 lines (79 loc) · 2.11 KB
/
main_loop.lua
File metadata and controls
93 lines (79 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
local path = (...):gsub(".main_loop", "")
local frequency_counter = require(path..".util.frequency_counter")
local main_loop = class({
name = "main_loop",
})
function main_loop:new(interpolate_render)
self.frametime = 1 / 60
self.ticks_per_second = frequency_counter()
self.frames_per_second = frequency_counter()
self.interpolate_render = interpolate_render or false
--redefine main loop
function love.run()
if love.load then
love.load(love.arg.parseGameArguments(arg), arg)
end
--(dont count love.load time)
love.timer.step()
--accumulator
local frametimer = 0
-- Main loop time.
return function()
-- process and handle events
if love.event then
love.event.pump()
for name, a,b,c,d,e,f in love.event.poll() do
if name == "quit" then
if not love.quit or not love.quit() then
return a or 0
end
end
love.handlers[name](a,b,c,d,e,f)
end
end
-- get time passed, and accumulate
local dt = love.timer.step()
-- fuzzy timing snapping
for _, v in ipairs {1/2, 1, 2} do
v = self.frametime * v
if math.abs(dt - v) < 0.002 then
dt = v
end
end
-- dt clamping
dt = math.clamp(dt, 0, 2 * self.frametime)
frametimer = frametimer + dt
-- accumulater clamping
frametimer = math.clamp(frametimer, 0, 8 * self.frametime)
local ticked = false
--spin updates if we're ready
while frametimer > self.frametime do
frametimer = frametimer - self.frametime
love.update(self.frametime) --pass consistent dt
self.ticks_per_second:add()
ticked = true
end
--render if we need to
if
love.graphics
and love.graphics.isActive()
and (ticked or self.interpolate_render)
then
love.graphics.origin()
love.graphics.clear(love.graphics.getBackgroundColor())
love.draw(frametimer / self.frametime) --pass interpolant
love.graphics.present()
self.frames_per_second:add()
end
if self.after_frame then
self:after_frame()
else
--sweep garbage always
manual_gc(1e-3)
--give the cpu a break
love.timer.sleep(0.001)
end
end
end
end
return main_loop