From c16b1e26393c133df2d660bae80ae908339b0ae4 Mon Sep 17 00:00:00 2001 From: Craig Robbins Date: Thu, 4 Dec 2014 23:37:04 +1000 Subject: [PATCH] Optimise VoxelManipulator::copyFrom ~3-4x faster This indirectly optimises MapBlock:copyTo() which in turn improves performance of MeshMakeData::fill() --- src/voxel.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/voxel.cpp b/src/voxel.cpp index 13711d1a1..e6d4bdcd2 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -224,13 +224,48 @@ void VoxelManipulator::addArea(const VoxelArea &area) void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area, v3s16 from_pos, v3s16 to_pos, v3s16 size) { - for(s16 z=0; z|'''''' dest mod '''''''' + * dest <---------------------------------------------> + * + * dest_mod (it's essentially a modulus) is added to the destination index + * after every full iteration of the y span. + * + * This method falls under the category "linear array and incrementing + * index". + */ + + s32 src_step = src_area.getExtent().X; + s32 dest_step = m_area.getExtent().X; + s32 dest_mod = m_area.index(to_pos.X, to_pos.Y, to_pos.Z + 1) + - m_area.index(to_pos.X, to_pos.Y, to_pos.Z) + - dest_step * size.Y; + + s32 i_src = src_area.index(from_pos.X, from_pos.Y, from_pos.Z); + s32 i_local = m_area.index(to_pos.X, to_pos.Y, to_pos.Z); + + for (s16 z = 0; z < size.Z; z++) { + for (s16 y = 0; y < size.Y; y++) { + memcpy(&m_data[i_local], &src[i_src], size.X * sizeof(*m_data)); + memset(&m_flags[i_local], 0, size.X); + i_src += src_step; + i_local += dest_step; + } + i_local += dest_mod; } } -- 2.25.1