remove some double lookups in dynos
Some checks are pending
Build coop / build-ubuntu (push) Waiting to run
Build coop / build-windows (push) Waiting to run
Build coop / build-macos-arm (push) Waiting to run
Build coop / build-macos-intel (push) Waiting to run

This commit is contained in:
Isaac0-dev 2025-04-08 14:32:25 +10:00
parent 7dc31e3780
commit a67c096ecb
3 changed files with 40 additions and 26 deletions

View file

@ -27,16 +27,20 @@ public:
void* get(int64_t key) { void* get(int64_t key) {
switch (mMapType) { switch (mMapType) {
case MapType::Ordered: case MapType::Ordered: {
if (mOrderedMap->count(key)) { auto it = mOrderedMap->find(key);
return mOrderedMap->at(key); if (it != mOrderedMap->end()) {
return it->second;
} }
break; break;
case MapType::Unordered: }
if (mUnorderedMap->count(key)) { case MapType::Unordered: {
return mUnorderedMap->at(key); auto it = mUnorderedMap->find(key);
if (it != mUnorderedMap->end()) {
return it->second;
} }
break; break;
}
} }
return nullptr; return nullptr;
} }

View file

@ -150,8 +150,9 @@ ActorGfx* DynOS_Actor_GetActorGfx(const GraphNode* aGraphNode) {
// If georef is not NULL, check georef // If georef is not NULL, check georef
if (aGraphNode->georef != NULL) { if (aGraphNode->georef != NULL) {
if (_ValidActors.count(aGraphNode->georef) != 0) { auto it = _ValidActors.find(aGraphNode->georef);
return &_ValidActors[aGraphNode->georef]; if (it != _ValidActors.end()) {
return &it->second;
} }
return NULL; return NULL;
} }
@ -177,10 +178,11 @@ void DynOS_Actor_Valid(const void* aGeoref, ActorGfx& aActorGfx) {
void DynOS_Actor_Invalid(const void* aGeoref, s32 aPackIndex) { void DynOS_Actor_Invalid(const void* aGeoref, s32 aPackIndex) {
if (aGeoref == NULL) { return; } if (aGeoref == NULL) { return; }
auto& _ValidActors = DynosValidActors(); auto& _ValidActors = DynosValidActors();
if (_ValidActors.count(aGeoref) == 0) { return; } auto it = _ValidActors.find(aGeoref);
if (_ValidActors[aGeoref].mPackIndex != aPackIndex) { return; } if (it == _ValidActors.end()) { return; }
if (it->second.mPackIndex != aPackIndex) { return; }
DynOS_Tex_Invalid(_ValidActors[aGeoref].mGfxData); DynOS_Tex_Invalid(it->second.mGfxData);
_ValidActors.erase(aGeoref); _ValidActors.erase(aGeoref);
} }
@ -191,7 +193,8 @@ void DynOS_Actor_Override(struct Object* obj, void** aSharedChild) {
if (georef == NULL) { return; } if (georef == NULL) { return; }
auto& _ValidActors = DynosValidActors(); auto& _ValidActors = DynosValidActors();
if (_ValidActors.count(georef) == 0) { return; } auto it = _ValidActors.find(georef);
if (it == _ValidActors.end()) { return; }
// Check if the behavior uses a character specific model // Check if the behavior uses a character specific model
if (obj && (obj->behavior == smlua_override_behavior(bhvMario) || if (obj && (obj->behavior == smlua_override_behavior(bhvMario) ||
@ -206,7 +209,7 @@ void DynOS_Actor_Override(struct Object* obj, void** aSharedChild) {
} }
*aSharedChild = (void*)_ValidActors[georef].mGraphNode; *aSharedChild = (void*)it->second.mGraphNode;
} }
void DynOS_Actor_Override_All(void) { void DynOS_Actor_Override_All(void) {

View file

@ -159,8 +159,9 @@ struct GraphNode* DynOS_Model_StoreGeo(u32* aId, enum ModelPool aModelPool, void
} }
struct GraphNode* DynOS_Model_GetErrorGeo() { struct GraphNode* DynOS_Model_GetErrorGeo() {
if (!sIdMap.count(MODEL_ERROR_MODEL)) { return NULL; } auto it = sIdMap.find(MODEL_ERROR_MODEL);
auto& vec = sIdMap[MODEL_ERROR_MODEL]; if (it == sIdMap.end()) { return NULL; }
auto& vec = it->second;
if (vec.size() == 0 || vec.empty()) { if (vec.size() == 0 || vec.empty()) {
return NULL; return NULL;
} }
@ -170,15 +171,17 @@ struct GraphNode* DynOS_Model_GetErrorGeo() {
struct GraphNode* DynOS_Model_GetGeo(u32 aId) { struct GraphNode* DynOS_Model_GetGeo(u32 aId) {
if (!aId) { return NULL; } if (!aId) { return NULL; }
if (sOverwriteMap.count(aId)) { auto overwriteIt = sOverwriteMap.find(aId);
aId = sOverwriteMap[aId]; if (overwriteIt != sOverwriteMap.end()) {
aId = overwriteIt->second;
} }
if (sIdMap.count(aId) == 0) { auto idIt = sIdMap.find(aId);
if (idIt == sIdMap.end()) {
return DynOS_Model_GetErrorGeo(); return DynOS_Model_GetErrorGeo();
} }
auto& vec = sIdMap[aId]; auto& vec = idIt->second;
if (vec.size() == 0 || vec.empty()) { if (vec.size() == 0 || vec.empty()) {
return DynOS_Model_GetErrorGeo(); return DynOS_Model_GetErrorGeo();
} }
@ -225,11 +228,14 @@ u32 DynOS_Model_GetIdFromAsset(void* asset) {
if (!asset) { return MODEL_NONE; } if (!asset) { return MODEL_NONE; }
u32 lowest = 9999; u32 lowest = 9999;
for (int i = 0; i < MODEL_POOL_MAX; i++) { for (int i = 0; i < MODEL_POOL_MAX; i++) {
if (!sAssetMap[i].count(asset)) { continue; } auto& map = sAssetMap[i];
u32 id = sAssetMap[i][asset].id; auto assetIt = map.find(asset);
if (assetIt == map.end()) { continue; }
u32 id = assetIt->second.id;
if (id < lowest) { lowest = id; } if (id < lowest) { lowest = id; }
if (sOverwriteMap.count(id)) { auto idIt = sOverwriteMap.find(id);
id = sOverwriteMap[id]; if (idIt != sOverwriteMap.end()) {
id = idIt->second;
if (id < lowest) { lowest = id; } if (id < lowest) { lowest = id; }
} }
} }
@ -337,17 +343,18 @@ void DynOS_Model_ClearPool(enum ModelPool aModelPool) {
auto& assetMap = sAssetMap[aModelPool]; auto& assetMap = sAssetMap[aModelPool];
for (auto& asset : assetMap) { for (auto& asset : assetMap) {
auto& info = asset.second; auto& info = asset.second;
if (sIdMap.count(info.id) == 0) { continue; } auto idIt = sIdMap.find(info.id);
if (idIt == sIdMap.end()) { continue; }
auto& idMap = idIt->second;
// preventing clearing permanent vanilla model slot // preventing clearing permanent vanilla model slot
if (info.id <= VANILLA_ID_END && sIdMap.count(info.id) <= 1) { if (info.id <= VANILLA_ID_END && idMap.size() <= 1) {
if (sAssetMap[MODEL_POOL_PERMANENT].count(info.asset) > 0) { if (sAssetMap[MODEL_POOL_PERMANENT].count(info.asset) > 0) {
continue; continue;
} }
} }
// erase from id map // erase from id map
auto& idMap = sIdMap[info.id];
for (auto info2 = idMap.begin(); info2 != idMap.end(); ) { for (auto info2 = idMap.begin(); info2 != idMap.end(); ) {
if (info.id == info2->id && info2->modelPool == aModelPool) { if (info.id == info2->id && info2->modelPool == aModelPool) {
info2 = idMap.erase(info2); info2 = idMap.erase(info2);