Cache the result of M_UnlockableSkinNum/FollowerNum/MapNum/Cup

Improves performance on mapheader iteration for M_Map/CupLocked significantly.
This commit is contained in:
toaster 2022-12-13 16:15:31 +00:00
parent 20c754ca66
commit fc6eff65c2
4 changed files with 78 additions and 28 deletions

View file

@ -2278,11 +2278,13 @@ void readunlockable(MYFILE *f, INT32 num)
unlockables[num].type = SECRET_ITEMFINDER;
else
unlockables[num].type = (INT16)i;
unlockables[num].stringVarCache = -1;
}
else if (fastcmp(word, "VAR"))
{
Z_Free(unlockables[num].stringVar);
unlockables[num].stringVar = Z_StrDup(word2);
unlockables[num].stringVarCache = -1;
unlockables[num].variable = (INT16)i;
}
else if (fastcmp(word, "ICON"))

View file

@ -4650,16 +4650,13 @@ static void M_DrawChallengePreview(INT32 x, INT32 y)
}
case SECRET_MAP:
{
if (ref->stringVar && ref->stringVar[0])
{
UINT16 mapnum = G_MapNumber(ref->stringVar);
K_DrawMapThumbnail(
(x-30)<<FRACBITS, (y)<<FRACBITS,
60<<FRACBITS,
0,
mapnum,
NULL);
}
UINT16 mapnum = M_UnlockableMapNum(ref);
K_DrawMapThumbnail(
(x-30)<<FRACBITS, (y)<<FRACBITS,
60<<FRACBITS,
0,
mapnum,
NULL);
break;
}
default:

View file

@ -1054,9 +1054,7 @@ boolean M_MapLocked(INT32 mapnum)
{
if (unlockables[i].type != SECRET_CUP)
continue;
if (!unlockables[i].stringVar || !unlockables[i].stringVar[0])
continue;
if (G_MapNumber(unlockables[i].stringVar) != mapnum-1)
if (M_UnlockableMapNum(&unlockables[i]) != mapnum-1)
continue;
return !M_CheckNetUnlockByID(i);
}
@ -1143,10 +1141,18 @@ INT32 M_UnlockableSkinNum(unlockable_t *unlock)
if (unlock->stringVar && unlock->stringVar[0])
{
INT32 skinnum;
if (unlock->stringVarCache != -1)
{
return unlock->stringVarCache;
}
// Get the skin from the string.
INT32 skinnum = R_SkinAvailable(unlock->stringVar);
skinnum = R_SkinAvailable(unlock->stringVar);
if (skinnum != -1)
{
unlock->stringVarCache = skinnum;
return skinnum;
}
}
@ -1172,10 +1178,18 @@ INT32 M_UnlockableFollowerNum(unlockable_t *unlock)
if (unlock->stringVar && unlock->stringVar[0])
{
INT32 skinnum;
if (unlock->stringVarCache != -1)
{
return unlock->stringVarCache;
}
// Get the skin from the string.
INT32 skinnum = K_FollowerAvailable(unlock->stringVar);
skinnum = K_FollowerAvailable(unlock->stringVar);
if (skinnum != -1)
{
unlock->stringVarCache = skinnum;
return skinnum;
}
}
@ -1193,6 +1207,7 @@ INT32 M_UnlockableFollowerNum(unlockable_t *unlock)
cupheader_t *M_UnlockableCup(unlockable_t *unlock)
{
cupheader_t *cup = kartcupheaders;
INT16 val = unlock->variable-1;
if (unlock->type != SECRET_CUP)
{
@ -1202,28 +1217,62 @@ cupheader_t *M_UnlockableCup(unlockable_t *unlock)
if (unlock->stringVar && unlock->stringVar[0])
{
// Get the cup from the string.
while (cup)
if (unlock->stringVarCache == -1)
{
if (!strcmp(cup->name, unlock->stringVar))
break;
cup = cup->next;
// Get the cup from the string.
while (cup)
{
if (!strcmp(cup->name, unlock->stringVar))
break;
cup = cup->next;
}
if (cup)
{
unlock->stringVarCache = cup->id;
}
return cup;
}
val = unlock->stringVarCache;
}
else
else if (val == -1)
{
// Use the number directly.
while (cup)
{
if (cup->id == unlock->variable)
break;
cup = cup->next;
}
return NULL;
}
// Use the number directly.
while (cup)
{
if (cup->id == val)
break;
cup = cup->next;
}
return cup;
}
INT16 M_UnlockableMapNum(unlockable_t *unlock)
{
if (unlock->type != SECRET_MAP)
{
// This isn't a map unlockable...
return NEXTMAP_INVALID;
}
if (unlock->stringVar && unlock->stringVar[0])
{
if (unlock->stringVarCache == -1)
{
unlock->stringVarCache = G_MapNumber(unlock->stringVar);
}
return unlock->stringVarCache;
}
return NEXTMAP_INVALID;
}
// ----------------
// Misc Emblem shit
// ----------------

View file

@ -89,6 +89,7 @@ struct unlockable_t
INT16 type;
INT16 variable;
char *stringVar;
INT16 stringVarCache;
UINT8 majorunlock;
};
@ -225,6 +226,7 @@ UINT8 M_GotLowEnoughTime(INT32 tictime);
INT32 M_UnlockableSkinNum(unlockable_t *unlock);
INT32 M_UnlockableFollowerNum(unlockable_t *unlock);
cupheader_t *M_UnlockableCup(unlockable_t *unlock);
INT16 M_UnlockableMapNum(unlockable_t *unlock);
INT32 M_EmblemSkinNum(emblem_t *emblem);