From 19df1b49693cd94b33088a924159c891908cd1cd Mon Sep 17 00:00:00 2001 From: CanerKaraca23 <37447503+CanerKaraca23@users.noreply.github.com> Date: Sat, 4 Apr 2026 11:48:35 +0000 Subject: [PATCH] Optimize linear searches in ExhaustFx dummy nodes Replaces `std::unordered_map` with `std::vector>` to enable direct O(1) array index lookups instead of expensive O(N) iteration advances inside ME_GetExhaustData and ME_SetExhaustData, improving the performance of plugin-sdk frame iterations. --- src/features/exhaust.cpp | 48 +++++++++++++--------------------------- src/features/exhausts.h | 2 +- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/src/features/exhaust.cpp b/src/features/exhaust.cpp index bf850da4..0800592c 100755 --- a/src/features/exhaust.cpp +++ b/src/features/exhaust.cpp @@ -77,7 +77,7 @@ void ExhaustFx::FindNodes(CVehicle *pVeh, RwFrame *pFrame) { auto &data = m_VehData.Get(pVeh); data.isUsed = true; - data.m_pDummies[std::move(name)] = std::move(LoadData(pVeh, pFrame)); + data.m_pDummies.emplace_back(std::move(name), std::move(LoadData(pVeh, pFrame))); } if (RwFrame *newFrame = pFrame->child) @@ -367,22 +367,13 @@ extern "C" if (!data.isUsed || index < 0 || index >= static_cast(data.m_pDummies.size())) return info; - int i = 0; - for (const auto &pair : data.m_pDummies) - { - if (i == index) - { - const ExhaustData &e = pair.second; - info.pFrame = e.pFrame; - info.Color = e.Color; - info.fSpeedMul = e.fSpeedMul; - info.fLifeTime = e.fLifeTime; - info.fSizeMul = e.fSizeMul; - info.bNitroEffect = e.bNitroEffect; - break; - } - ++i; - } + const ExhaustData &e = data.m_pDummies[index].second; + info.pFrame = e.pFrame; + info.Color = e.Color; + info.fSpeedMul = e.fSpeedMul; + info.fLifeTime = e.fLifeTime; + info.fSizeMul = e.fSizeMul; + info.bNitroEffect = e.bNitroEffect; return info; } @@ -396,22 +387,13 @@ extern "C" if (!vData.isUsed || index < 0 || index >= static_cast(vData.m_pDummies.size())) return; - int i = 0; - for (auto &pair : vData.m_pDummies) - { - if (i == index) - { - ExhaustData &e = pair.second; - data.pFrame = e.pFrame; - data.Color = e.Color; - data.fSpeedMul = e.fSpeedMul; - data.fLifeTime = e.fLifeTime; - data.fSizeMul = e.fSizeMul; - data.bNitroEffect = e.bNitroEffect; - break; - } - ++i; - } + ExhaustData &e = vData.m_pDummies[index].second; + e.pFrame = data.pFrame; + e.Color = data.Color; + e.fSpeedMul = data.fSpeedMul; + e.fLifeTime = data.fLifeTime; + e.fSizeMul = data.fSizeMul; + e.bNitroEffect = data.bNitroEffect; } // Dummy function to show on crash logs diff --git a/src/features/exhausts.h b/src/features/exhausts.h index 321c8f95..3dcbadfb 100755 --- a/src/features/exhausts.h +++ b/src/features/exhausts.h @@ -31,7 +31,7 @@ struct ExhaustData struct ExhaustVehData { bool isUsed = false; size_t reloadCount = 0; - std::unordered_map m_pDummies; + std::vector> m_pDummies; ExhaustVehData(CVehicle *pVeh) { isUsed = false; } ~ExhaustVehData() {