Huge Performance improvements

master
Elias Fleckenstein 2020-08-11 17:59:17 +02:00
parent 0dcc4b5bc8
commit 0a8d3b36d3
11 changed files with 125 additions and 72 deletions

View File

@ -8,7 +8,7 @@ function graphics:init()
RenderEngine.mouse_sensitivity = 0.7
--RenderEngine.pitch_move = true
RenderEngine.mesh_effect_grow_time = 0.25
RenderEngine.mesh_effect_flyin_time = 1
RenderEngine.mesh_effect_flyin_time = 0.5
RenderEngine.mesh_effect_flyin_offset = 20
--RenderEngine.mesh_effect_rotate_speed =
@ -24,20 +24,12 @@ function graphics:init()
end
function graphics:create_chunk_meshes(chunk)
for _, block in pairs(chunk.blocks) do
self:create_block_mesh(block, false)
end
end
function graphics:create_block_mesh(block, grow)
local mesh = RenderEngine.Mesh()
mesh:set_pos(block.pos)
local mesh = RenderEngine.ChunkMesh()
mesh:set_pos(glm.vec3(0, 0, 0))
mesh:set_size(glm.vec3(1, 1, 1))
mesh:set_texture(block.def.texture)
mesh:make_cube()
if grow then
mesh:set_effect(RenderEngine.Mesh.EFFECT_GROW)
end
mesh:set_texture(BlockSystem:get_def("game:dirt").texture)
mesh:create_vertices(chunk)
mesh:set_effect(RenderEngine.Mesh.EFFECT_FLYIN)
mesh:add_to_scene()
end

View File

@ -8,4 +8,8 @@ Client.player = PlayerSystem.LocalPlayer()
Client.player:set_position(glm.vec3(8, 20, 8))
RenderEngine:render_loop()
Dragonblocks:add_task(function()
repeat
coroutine.yield("FPS:" .. math.floor(Dragonblocks.tps or 0))
until false
end)

View File

@ -6,7 +6,7 @@ function LocalPlayer:constructor()
self:set_speed(10)
self:set_fov(86.1)
self:set_yaw(-90)
self:set_pitch(0)
self:set_pitch(-80)
self:add_event_listener("after_set_position", function(event) self:set_position_callback(event) end)
RenderEngine:add_event_listener("keypress", function(event) self:key_press_callback(event) end)
RenderEngine:add_event_listener("mousemove", function(event) self:mouse_move_callback(event) end)

View File

@ -0,0 +1,44 @@
local ChunkMesh = Dragonblocks.create_class()
table.assign(ChunkMesh, RenderEngine.Mesh)
function ChunkMesh:create_vertices(chunk)
self.vertices = {}
self.textures = {}
self.vertex_blob_size = 6
local face_orientations = {
glm.vec3( 0, 0, -1),
glm.vec3( 0, 0, 1),
glm.vec3(-1, 0, 0),
glm.vec3( 1, 0, 0),
glm.vec3( 0, -1, 0),
glm.vec3( 0, 1, 0),
}
for _, block in pairs(chunk.blocks) do
for i, dir in ipairs(face_orientations) do
local pos = block.pos
if not chunk:get_block(pos + dir) then
table.insert(self.textures, block.def.texture)
self:add_face(block.pos, i)
end
end
end
self:apply_vertices(self.vertices)
end
function ChunkMesh:add_face(pos, facenr)
local cube_vertices = RenderEngine.cube_vertices
local pos_modifier = {pos.x, pos.y, pos.z}
local offset = (facenr - 1) * 6
for vertex_index = offset, offset + 5 do
for attribute_index = 1, 5 do
local k = vertex_index * 5 + attribute_index
local v = cube_vertices[k]
if attribute_index <= 3 then
v = v + pos_modifier[attribute_index]
end
table.insert(self.vertices, v)
end
end
end
return ChunkMesh

View File

@ -1,43 +0,0 @@
return {
-0.5, -0.5, -0.5, 0.0, 0.0,
0.5, -0.5, -0.5, 1.0, 0.0,
0.5, 0.5, -0.5, 1.0, 1.0,
0.5, 0.5, -0.5, 1.0, 1.0,
-0.5, 0.5, -0.5, 0.0, 1.0,
-0.5, -0.5, -0.5, 0.0, 0.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
0.5, -0.5, 0.5, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0, 1.0,
0.5, 0.5, 0.5, 1.0, 1.0,
-0.5, 0.5, 0.5, 0.0, 1.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0, 0.0,
-0.5, 0.5, -0.5, 1.0, 1.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0, 0.0,
0.5, 0.5, -0.5, 1.0, 1.0,
0.5, -0.5, -0.5, 0.0, 1.0,
0.5, -0.5, -0.5, 0.0, 1.0,
0.5, -0.5, 0.5, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0, 0.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
0.5, -0.5, -0.5, 1.0, 1.0,
0.5, -0.5, 0.5, 1.0, 0.0,
0.5, -0.5, 0.5, 1.0, 0.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
-0.5, 0.5, -0.5, 0.0, 1.0,
0.5, 0.5, -0.5, 1.0, 1.0,
0.5, 0.5, 0.5, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0, 0.0,
-0.5, 0.5, 0.5, 0.0, 0.0,
-0.5, 0.5, -0.5, 0.0, 1.0
}

View File

@ -0,0 +1,44 @@
return {
-0.5, -0.5, -0.5, 0.0, 0.0,
0.5, -0.5, -0.5, 1.0, 0.0,
0.5, 0.5, -0.5, 1.0, 1.0,
0.5, 0.5, -0.5, 1.0, 1.0,
-0.5, 0.5, -0.5, 0.0, 1.0,
-0.5, -0.5, -0.5, 0.0, 0.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
0.5, -0.5, 0.5, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0, 1.0,
0.5, 0.5, 0.5, 1.0, 1.0,
-0.5, 0.5, 0.5, 0.0, 1.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0, 0.0,
-0.5, 0.5, -0.5, 1.0, 1.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0, 0.0,
0.5, 0.5, -0.5, 1.0, 1.0,
0.5, -0.5, -0.5, 0.0, 1.0,
0.5, -0.5, -0.5, 0.0, 1.0,
0.5, -0.5, 0.5, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0, 0.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
0.5, -0.5, -0.5, 1.0, 1.0,
0.5, -0.5, 0.5, 1.0, 0.0,
0.5, -0.5, 0.5, 1.0, 0.0,
-0.5, -0.5, 0.5, 0.0, 0.0,
-0.5, -0.5, -0.5, 0.0, 1.0,
-0.5, 0.5, -0.5, 0.0, 1.0,
0.5, 0.5, -0.5, 1.0, 1.0,
0.5, 0.5, 0.5, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0, 0.0,
-0.5, 0.5, 0.5, 0.0, 0.0,
-0.5, 0.5, -0.5, 0.0, 1.0,
}

View File

@ -3,7 +3,9 @@ RenderEngine:run("shaders")
RenderEngine:run("textures")
RenderEngine:run("window")
RenderEngine.cube_vertices = RenderEngine:run("cube_vertices")
RenderEngine.Mesh = RenderEngine:run("mesh")
RenderEngine.ChunkMesh = RenderEngine:run("chunk_mesh")
RenderEngine.camera = RenderEngine:run("camera")
function RenderEngine:init()
@ -25,12 +27,15 @@ function RenderEngine:add_render_task()
end)
end
function RenderEngine:render_loop()
function RenderEngine:render_loop(is_only_task)
self.last_time = glfw.get_time()
repeat
self:render()
--coroutine.yield()
if not is_only_task then
coroutine.yield()
end
until glfw.window_should_close(self.window)
os.exit()
end
function RenderEngine:update_projection_matrix()
@ -53,7 +58,7 @@ function RenderEngine:render()
gl.use_program(self.shaders)
RenderEngine:update_view_matrix()
self:update_view_matrix()
for _, mesh in ipairs(self.Mesh.list) do
mesh:render(dtime)

View File

@ -3,7 +3,6 @@ local Mesh = Dragonblocks.create_class()
Mesh.EFFECT_GROW = 1
Mesh.EFFECT_FLYIN = 2
Mesh.EFFECT_ROTATE = 3
Mesh.CUBE = RenderEngine:run("cube")
Mesh.list = {}
function Mesh:set_size(size)
@ -15,7 +14,7 @@ function Mesh:set_pos(pos)
end
function Mesh:set_texture(texture)
self.texture = texture
self.textures = {texture}
end
function Mesh:set_effect(effect, after)
@ -41,11 +40,9 @@ function Mesh:remove_from_scene()
end
end
function Mesh:make_cube()
self:apply_vertices(Mesh.CUBE)
end
function Mesh:apply_vertices(vertices)
self.vertex_blob_count = #vertices / 5 / self.vertex_blob_size
self.vao = gl.gen_vertex_arrays(1)
self.vbo = gl.gen_buffers(1)
@ -100,9 +97,11 @@ function Mesh:render(dtime)
gl.uniform_matrix4f(gl.get_uniform_location(RenderEngine.shaders, "model"), true, model_matrix)
gl.active_texture(0)
gl.bind_texture("2d", self.texture)
gl.bind_vertex_array(self.vao)
gl.draw_arrays("triangles", 0, 36)
for i = 1, self.vertex_blob_count do
gl.bind_texture("2d", self.textures[i])
gl.draw_arrays("triangles", (i - 1) * self.vertex_blob_size, self.vertex_blob_size)
end
gl.unbind_vertex_array()
gl.unbind_texture("2d")
end

View File

@ -12,7 +12,9 @@ function Chunk:constructor()
end
function Chunk:get_pos_hash(pos)
return pos.x + size * pos.y + size_squared * pos.z
local x, y, z = pos.x, pos.y, pos.z
if x > 15 or y > 15 or z > 15 or x < 0 or y < 0 or z < 0 then return end
return x + size * y + size_squared * z
end
function Chunk:add_block(pos, def)

View File

@ -23,6 +23,8 @@ function Dragonblocks:serialize()
vdata = v
elseif vtype == "boolean" then
vdata = v and "true" or "false"
elseif vtype == "function" then
vdata = tostring(v)
else
serialize_pair = false
end

View File

@ -11,7 +11,11 @@ function Dragonblocks:step()
local tasks = self.tasks
self.tasks = {}
for _, t in ipairs(tasks) do
if coroutine.resume(t) then
local continue, status = coroutine.resume(t)
if status then
print(status)
end
if continue then
table.insert(self.tasks, t)
end
end