The code has some Lua gotcha issues, particularly related to memory trash and abuse of the # operator. You don't notice typically notice these issues until things come crashing down unfortunately, which they did. The engine is very cool but I think I spent more time hacking it than using it as intended (partially my fault for introducing it late I guess).
I thought the issue would have been fixed had I upgraded to v2 but I couldn't have been more wrong.
V1: 120fps 172 shadow casters create 8MB/s of memory trash.
V2: 120fps 172 shadow casters create 55MB/s of memory trash!
I thought 8MB/s was pretty bad, mostly because I have not consolidated shadow masses yet, but 55MB/s is out of this world.
This code is mostly flawed because the vector class creates and destroys tables and you're doing it a thousand times each frame.
Code: Select all
body.lua function body:drawPolyShadow(light) local lightPosition = vector(light.x, light.y) local lh = lightPosition * self.zheight local height_diff = (self.zheight - light.z) if height_diff == 0 then -- prevent inf height_diff = -0.001 end for i = 1, #self.data, 2 do local vertex = vector(self.data[i], self.data[i + 1]) local nextVertex = vector(self.data[(i + 2) % #self.data], self.data[(i + 2) % #self.data + 1]) local startToEnd = nextVertex - vertex if vector(startToEnd.y, -startToEnd.x) * (vertex - lightPosition) > 0 then local point1 = (lh - (vertex * light.z))/height_diff local point2 = (lh - (nextVertex * light.z))/height_diff love.graphics.polygon("fill", vertex.x, vertex.y, point1.x, point1.y, point2.x, point2.y, nextVertex.x, nextVertex.y) end end end
Code: Select all
function drawPolyShadow(body, light) local lh_x = light.x * body.z local lh_y = light.y * body.z local height_diff = (body.z - light.z) if height_diff == 0 then -- prevent inf height_diff = -0.001 end local blen = #body.data --should probably be stored on the body instead of counted every time for i = 1, blen, 2 do local v_x, v_y = body.data[i], body.data[i+1] local nv_x, nv_y = body.data[(i + 2) % blen], body.data[(i + 2) % blen + 1] local p1_x, p1_y = (lh_x - (v_x * light.z))/height_diff, (lh_y - (v_y * light.z))/height_diff local p2_x, p2_y = (lh_x - (nv_x * light.z))/height_diff, (lh_y - (nv_y * light.z))/height_diff love.graphics.polygon("fill", v_x, v_y, p1_x, p1_y, p2_x, p2_y, nv_x, nv_y) end end
I figured I would mention this issue because it feels awfully out of line for what is going on.
Please be more careful with the # operator for performance reasons (just store the length every frame) and table creation / using C-style classes in performance-heavy situations.