From 0a8d3b36d3f7f00d3af506990a8d5cb8ad39a80a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 11 Aug 2020 17:59:17 +0200 Subject: [PATCH] Huge Performance improvements --- modules/Client/src/graphics.lua | 20 +++------- modules/Client/src/init.lua | 6 ++- modules/PlayerSystem/src/localplayer.lua | 2 +- modules/RenderEngine/src/chunk_mesh.lua | 44 ++++++++++++++++++++++ modules/RenderEngine/src/cube.lua | 43 --------------------- modules/RenderEngine/src/cube_vertices.lua | 44 ++++++++++++++++++++++ modules/RenderEngine/src/init.lua | 11 ++++-- modules/RenderEngine/src/mesh.lua | 15 ++++---- modules/WorldSystem/src/chunk.lua | 4 +- src/serialisation.lua | 2 + src/taskmgr.lua | 6 ++- 11 files changed, 125 insertions(+), 72 deletions(-) create mode 100644 modules/RenderEngine/src/chunk_mesh.lua delete mode 100644 modules/RenderEngine/src/cube.lua create mode 100644 modules/RenderEngine/src/cube_vertices.lua diff --git a/modules/Client/src/graphics.lua b/modules/Client/src/graphics.lua index cc883f6..9f41267 100644 --- a/modules/Client/src/graphics.lua +++ b/modules/Client/src/graphics.lua @@ -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 diff --git a/modules/Client/src/init.lua b/modules/Client/src/init.lua index ad7c81b..067b041 100644 --- a/modules/Client/src/init.lua +++ b/modules/Client/src/init.lua @@ -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) diff --git a/modules/PlayerSystem/src/localplayer.lua b/modules/PlayerSystem/src/localplayer.lua index d2e46a8..753520f 100644 --- a/modules/PlayerSystem/src/localplayer.lua +++ b/modules/PlayerSystem/src/localplayer.lua @@ -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) diff --git a/modules/RenderEngine/src/chunk_mesh.lua b/modules/RenderEngine/src/chunk_mesh.lua new file mode 100644 index 0000000..4a1369d --- /dev/null +++ b/modules/RenderEngine/src/chunk_mesh.lua @@ -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 diff --git a/modules/RenderEngine/src/cube.lua b/modules/RenderEngine/src/cube.lua deleted file mode 100644 index ba4e6c9..0000000 --- a/modules/RenderEngine/src/cube.lua +++ /dev/null @@ -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 -} diff --git a/modules/RenderEngine/src/cube_vertices.lua b/modules/RenderEngine/src/cube_vertices.lua new file mode 100644 index 0000000..a088dbd --- /dev/null +++ b/modules/RenderEngine/src/cube_vertices.lua @@ -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, +} + diff --git a/modules/RenderEngine/src/init.lua b/modules/RenderEngine/src/init.lua index 39ec7fc..4b060ab 100644 --- a/modules/RenderEngine/src/init.lua +++ b/modules/RenderEngine/src/init.lua @@ -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) diff --git a/modules/RenderEngine/src/mesh.lua b/modules/RenderEngine/src/mesh.lua index 446e2b4..94c2a57 100644 --- a/modules/RenderEngine/src/mesh.lua +++ b/modules/RenderEngine/src/mesh.lua @@ -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 diff --git a/modules/WorldSystem/src/chunk.lua b/modules/WorldSystem/src/chunk.lua index 1d68249..f49390e 100644 --- a/modules/WorldSystem/src/chunk.lua +++ b/modules/WorldSystem/src/chunk.lua @@ -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) diff --git a/src/serialisation.lua b/src/serialisation.lua index a1877ed..bcd8d7b 100644 --- a/src/serialisation.lua +++ b/src/serialisation.lua @@ -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 diff --git a/src/taskmgr.lua b/src/taskmgr.lua index 7792718..4c4693e 100644 --- a/src/taskmgr.lua +++ b/src/taskmgr.lua @@ -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 -- 2.44.0