From 342e3d7e097e11f5db28f98509841d559c3b5a40 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 3 Sep 2022 23:34:34 +0200 Subject: [PATCH] Implement cache of loaded ObjData files --- src/openrct2/object/ImageTable.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/openrct2/object/ImageTable.cpp b/src/openrct2/object/ImageTable.cpp index 98602dd3dd..1d95cbcd51 100644 --- a/src/openrct2/object/ImageTable.cpp +++ b/src/openrct2/object/ImageTable.cpp @@ -30,6 +30,8 @@ using namespace OpenRCT2; using namespace OpenRCT2::Drawing; +static thread_local std::map> _objDataCache = {}; + struct ImageTable::RequiredImage { rct_g1_element g1{}; @@ -294,12 +296,25 @@ std::vector> ImageTable::LoadObjectIm IReadObjectContext* context, const std::string& name, const std::vector& range) { std::vector> result; - auto objectPath = FindLegacyObject(name); - auto obj = ObjectFactory::CreateObjectFromLegacyFile( - context->GetObjectRepository(), objectPath.c_str(), !gOpenRCT2NoGraphics); + Object* obj; + + auto cached = _objDataCache.find(name); + if (cached != _objDataCache.end()) + { + obj = cached->second.get(); + } + else + { + auto objectPath = FindLegacyObject(name); + auto tmp = ObjectFactory::CreateObjectFromLegacyFile( + context->GetObjectRepository(), objectPath.c_str(), !gOpenRCT2NoGraphics); + auto inserted = _objDataCache.insert({ name, std::move(tmp) }); + obj = inserted.first->second.get(); + } + if (obj != nullptr) { - auto& imgTable = static_cast(obj.get())->GetImageTable(); + auto& imgTable = static_cast(obj)->GetImageTable(); auto numImages = static_cast(imgTable.GetCount()); auto images = imgTable.GetImages(); size_t placeHoldersAdded = 0; @@ -326,7 +341,7 @@ std::vector> ImageTable::LoadObjectIm } else { - std::string msg = "Unable to open '" + objectPath + "'"; + std::string msg = "Unable to open '" + name + "'"; context->LogWarning(ObjectError::InvalidProperty, msg.c_str()); for (size_t i = 0; i < range.size(); i++) { @@ -588,6 +603,8 @@ bool ImageTable::ReadJson(IReadObjectContext* context, json_t& root) } } + _objDataCache.clear(); + return usesFallbackSprites; }