From 3e50850260db13ec63ce4ca0e47e7fd7e30ce484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Wed, 26 Jul 2017 20:12:48 +0200 Subject: [PATCH] TileLayer: use shared_ptr for FrameSpec vector (#6171) * TileLayer: use shared_ptr for vector framespec This reduce memory copy of TileLayer from (4 to 16) * FrameSpec where FrameSpec = (sizeof(int) + 3 * sizeof(ptr)) to int + sizeof(ptr) Callgrind difference Before: https://lut.im/RGkiJqQb8T/LeQIEXpAuRzfl7gd.png After: https://lut.im/bcqmwee1xu/cTwtptY5tRuS9lp0.png * Fix one push_back to use vector::emplace_back & optimize inclusions --- src/client/tile.h | 3 ++- src/mapblock_mesh.cpp | 12 ++++-------- src/nodedef.cpp | 7 +++++-- src/particles.cpp | 2 +- src/wieldmesh.cpp | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/client/tile.h b/src/client/tile.h index aadc3e156..cfdcf30bd 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "util/numeric.h" class IGameDef; @@ -284,7 +285,7 @@ struct TileLayer //! If true, the tile has its own color. bool has_color = false; - std::vector frames; + std::shared_ptr> frames = nullptr; /*! * The color of the tile, or if the tile does not own diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index e854127c0..67195cab3 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -18,17 +18,12 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "mapblock_mesh.h" -#include "light.h" #include "mapblock.h" #include "map.h" #include "profiler.h" -#include "nodedef.h" #include "mesh.h" #include "minimap.h" #include "content_mapblock.h" -#include "noise.h" -#include "shader.h" -#include "settings.h" #include "util/directiontables.h" #include "client/renderingengine.h" @@ -602,7 +597,8 @@ static void makeFastFace(const TileSpec &tile, u16 li0, u16 li1, u16 li2, u16 li if (layer->texture_id == 0) continue; - dest.push_back(FastFace()); + // equivalent to dest.push_back(FastFace()) but faster + dest.emplace_back(); FastFace& face = *dest.rbegin(); for (u8 i = 0; i < 4; i++) { @@ -1126,7 +1122,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): m_animation_frame_offsets[std::pair(layer, i)] = 0; } // Replace tile texture with the first animation frame - p.layer.texture = p.layer.frames[0].texture; + p.layer.texture = (*p.layer.frames)[0].texture; } if (!m_enable_shaders) { @@ -1314,7 +1310,7 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat scene::IMeshBuffer *buf = m_mesh[i->first.first]-> getMeshBuffer(i->first.second); - const FrameSpec &animation_frame = tile.frames[frame]; + const FrameSpec &animation_frame = (*tile.frames)[frame]; buf->getMaterial().setTexture(0, animation_frame.texture); if (m_enable_shaders) { if (animation_frame.normal_texture) { diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 6bb2bf904..fc404f252 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -637,7 +637,10 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile, tile->material_flags &= ~MATERIAL_FLAG_ANIMATION; } else { std::ostringstream os(std::ios::binary); - tile->frames.resize(frame_count); + if (!tile->frames) { + tile->frames = std::make_shared>(); + } + tile->frames->resize(frame_count); for (int i = 0; i < frame_count; i++) { @@ -652,7 +655,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile, if (tile->normal_texture) frame.normal_texture = tsrc->getNormalTexture(os.str()); frame.flags_texture = tile->flags_texture; - tile->frames[i] = frame; + (*tile->frames)[i] = frame; } } } diff --git a/src/particles.cpp b/src/particles.cpp index 10b9811bb..b86266f42 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -631,7 +631,7 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, // Only use first frame of animated texture if (tile.material_flags & MATERIAL_FLAG_ANIMATION) - texture = tile.frames[0].texture; + texture = (*tile.frames)[0].texture; else texture = tile.texture; diff --git a/src/wieldmesh.cpp b/src/wieldmesh.cpp index e0d6b7e0d..c532a048c 100644 --- a/src/wieldmesh.cpp +++ b/src/wieldmesh.cpp @@ -593,7 +593,7 @@ void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, material.MaterialType = *mattype; } if (layer->animation_frame_count > 1) { - FrameSpec animation_frame = layer->frames[0]; + const FrameSpec &animation_frame = (*layer->frames)[0]; material.setTexture(0, animation_frame.texture); } else { material.setTexture(0, layer->texture); @@ -601,7 +601,7 @@ void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, if (use_shaders) { if (layer->normal_texture) { if (layer->animation_frame_count > 1) { - FrameSpec animation_frame = layer->frames[0]; + const FrameSpec &animation_frame = (*layer->frames)[0]; material.setTexture(1, animation_frame.normal_texture); } else material.setTexture(1, layer->normal_texture);