From be457ae5d6311864639f499a0975d1b7a09c90d6 Mon Sep 17 00:00:00 2001 From: CanerKaraca23 <37447503+CanerKaraca23@users.noreply.github.com> Date: Sat, 4 Apr 2026 10:49:09 +0000 Subject: [PATCH] perf(pedcols): optimize material color store to use flat vector Replaced the `std::unordered_map>` in `src/features/pedcols.cpp` with a flat `std::vector`. Since GTA SA ped rendering is single-threaded and sequential (`before` -> render -> `after`), a single vector is safe to use and eliminates per-ped hash map lookups, small vector allocations, and a subtle memory leak caused by `store[pPed].clear()` unconditionally inserting empty vectors for peds. --- src/features/pedcols.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/features/pedcols.cpp b/src/features/pedcols.cpp index 6a11849e..40e05b14 100755 --- a/src/features/pedcols.cpp +++ b/src/features/pedcols.cpp @@ -9,7 +9,7 @@ using namespace plugin; #define RwRGBAGetRGB(a) (*(DWORD *)&(a) & 0xFFFFFF) -std::unordered_map>> store; +std::vector> store; void PedColors::SetEditableMaterials(RpClump *pClump) { RpClumpForAllAtomics(pClump, [](RpAtomic * pAtomic, void *data) { @@ -35,7 +35,7 @@ void PedColors::SetEditableMaterials(RpClump *pClump) { default: return pMaterial; } - store[PedColors::m_pCurrentPed].push_back(std::make_pair(&pMaterial->color, *reinterpret_cast(&pMaterial->color))); + store.push_back(std::make_pair(&pMaterial->color, *reinterpret_cast(&pMaterial->color))); pMaterial->color.red = data.m_Colors[idx].r; pMaterial->color.green = data.m_Colors[idx].g; pMaterial->color.blue = data.m_Colors[idx].b; @@ -105,9 +105,9 @@ void PedColors::Init() { }; Events::pedRenderEvent.after += [](CPed *pPed) { - for (auto &e : store[pPed]) { + for (auto &e : store) { *static_cast(e.first) = e.second; } - store[pPed].clear(); + store.clear(); }; } \ No newline at end of file