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 inclusionsmaster
parent
9a17b65f26
commit
3e50850260
|
@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <SMaterial.h>
|
#include <SMaterial.h>
|
||||||
|
#include <memory>
|
||||||
#include "util/numeric.h"
|
#include "util/numeric.h"
|
||||||
|
|
||||||
class IGameDef;
|
class IGameDef;
|
||||||
|
@ -284,7 +285,7 @@ struct TileLayer
|
||||||
//! If true, the tile has its own color.
|
//! If true, the tile has its own color.
|
||||||
bool has_color = false;
|
bool has_color = false;
|
||||||
|
|
||||||
std::vector<FrameSpec> frames;
|
std::shared_ptr<std::vector<FrameSpec>> frames = nullptr;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* The color of the tile, or if the tile does not own
|
* The color of the tile, or if the tile does not own
|
||||||
|
|
|
@ -18,17 +18,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mapblock_mesh.h"
|
#include "mapblock_mesh.h"
|
||||||
#include "light.h"
|
|
||||||
#include "mapblock.h"
|
#include "mapblock.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "profiler.h"
|
#include "profiler.h"
|
||||||
#include "nodedef.h"
|
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
#include "minimap.h"
|
#include "minimap.h"
|
||||||
#include "content_mapblock.h"
|
#include "content_mapblock.h"
|
||||||
#include "noise.h"
|
|
||||||
#include "shader.h"
|
|
||||||
#include "settings.h"
|
|
||||||
#include "util/directiontables.h"
|
#include "util/directiontables.h"
|
||||||
#include "client/renderingengine.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)
|
if (layer->texture_id == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dest.push_back(FastFace());
|
// equivalent to dest.push_back(FastFace()) but faster
|
||||||
|
dest.emplace_back();
|
||||||
FastFace& face = *dest.rbegin();
|
FastFace& face = *dest.rbegin();
|
||||||
|
|
||||||
for (u8 i = 0; i < 4; i++) {
|
for (u8 i = 0; i < 4; i++) {
|
||||||
|
@ -1126,7 +1122,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
||||||
m_animation_frame_offsets[std::pair<u8, u32>(layer, i)] = 0;
|
m_animation_frame_offsets[std::pair<u8, u32>(layer, i)] = 0;
|
||||||
}
|
}
|
||||||
// Replace tile texture with the first animation frame
|
// 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) {
|
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]->
|
scene::IMeshBuffer *buf = m_mesh[i->first.first]->
|
||||||
getMeshBuffer(i->first.second);
|
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);
|
buf->getMaterial().setTexture(0, animation_frame.texture);
|
||||||
if (m_enable_shaders) {
|
if (m_enable_shaders) {
|
||||||
if (animation_frame.normal_texture) {
|
if (animation_frame.normal_texture) {
|
||||||
|
|
|
@ -637,7 +637,10 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile,
|
||||||
tile->material_flags &= ~MATERIAL_FLAG_ANIMATION;
|
tile->material_flags &= ~MATERIAL_FLAG_ANIMATION;
|
||||||
} else {
|
} else {
|
||||||
std::ostringstream os(std::ios::binary);
|
std::ostringstream os(std::ios::binary);
|
||||||
tile->frames.resize(frame_count);
|
if (!tile->frames) {
|
||||||
|
tile->frames = std::make_shared<std::vector<FrameSpec>>();
|
||||||
|
}
|
||||||
|
tile->frames->resize(frame_count);
|
||||||
|
|
||||||
for (int i = 0; i < frame_count; i++) {
|
for (int i = 0; i < frame_count; i++) {
|
||||||
|
|
||||||
|
@ -652,7 +655,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile,
|
||||||
if (tile->normal_texture)
|
if (tile->normal_texture)
|
||||||
frame.normal_texture = tsrc->getNormalTexture(os.str());
|
frame.normal_texture = tsrc->getNormalTexture(os.str());
|
||||||
frame.flags_texture = tile->flags_texture;
|
frame.flags_texture = tile->flags_texture;
|
||||||
tile->frames[i] = frame;
|
(*tile->frames)[i] = frame;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -631,7 +631,7 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef,
|
||||||
|
|
||||||
// Only use first frame of animated texture
|
// Only use first frame of animated texture
|
||||||
if (tile.material_flags & MATERIAL_FLAG_ANIMATION)
|
if (tile.material_flags & MATERIAL_FLAG_ANIMATION)
|
||||||
texture = tile.frames[0].texture;
|
texture = (*tile.frames)[0].texture;
|
||||||
else
|
else
|
||||||
texture = tile.texture;
|
texture = tile.texture;
|
||||||
|
|
||||||
|
|
|
@ -593,7 +593,7 @@ void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f,
|
||||||
material.MaterialType = *mattype;
|
material.MaterialType = *mattype;
|
||||||
}
|
}
|
||||||
if (layer->animation_frame_count > 1) {
|
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);
|
material.setTexture(0, animation_frame.texture);
|
||||||
} else {
|
} else {
|
||||||
material.setTexture(0, layer->texture);
|
material.setTexture(0, layer->texture);
|
||||||
|
@ -601,7 +601,7 @@ void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f,
|
||||||
if (use_shaders) {
|
if (use_shaders) {
|
||||||
if (layer->normal_texture) {
|
if (layer->normal_texture) {
|
||||||
if (layer->animation_frame_count > 1) {
|
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);
|
material.setTexture(1, animation_frame.normal_texture);
|
||||||
} else
|
} else
|
||||||
material.setTexture(1, layer->normal_texture);
|
material.setTexture(1, layer->normal_texture);
|
||||||
|
|
Loading…
Reference in New Issue