From 37d2bc8a5fad4fe84b1361ba38c1c9faac2c1660 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 15 Apr 2025 21:42:39 +0200 Subject: [PATCH] Reuse some allocations in ClientMap rendering --- src/client/clientmap.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index 497c3452f..5098818ec 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -120,6 +120,11 @@ namespace { inline T subtract_or_zero(T a, T b) { return b >= a ? T(0) : (a - b); } + + // file-scope thread-local instances of the above two data structures, because + // allocating memory in a hot path can be expensive. + thread_local MeshBufListMaps tl_meshbuflistmaps; + thread_local DrawDescriptorList tl_drawdescriptorlist; } void CachedMeshBuffer::drop() @@ -978,8 +983,10 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) */ TimeTaker tt_collect(""); - MeshBufListMaps grouped_buffers; - DrawDescriptorList draw_order; + MeshBufListMaps &grouped_buffers = tl_meshbuflistmaps; + DrawDescriptorList &draw_order = tl_drawdescriptorlist; + grouped_buffers.clear(); + draw_order.clear(); auto is_frustum_culled = m_client->getCamera()->getFrustumCuller(); @@ -1375,8 +1382,10 @@ void ClientMap::renderMapShadows(video::IVideoDriver *driver, return intToFloat(mesh_grid.getMeshPos(pos) * MAP_BLOCKSIZE - m_camera_offset, BS); }; - MeshBufListMaps grouped_buffers; - DrawDescriptorList draw_order; + MeshBufListMaps &grouped_buffers = tl_meshbuflistmaps; + DrawDescriptorList &draw_order = tl_drawdescriptorlist; + grouped_buffers.clear(); + draw_order.clear(); std::size_t count = 0; std::size_t meshes_per_frame = m_drawlist_shadow.size() / total_frames + 1;