From 3e50850260db13ec63ce4ca0e47e7fd7e30ce484 Mon Sep 17 00:00:00 2001 From: Loïc Blot Date: Wed, 26 Jul 2017 20:12:48 +0200 Subject: 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/nodedef.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/nodedef.cpp') 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; } } } -- cgit v1.2.3