From b8f334a83c681996a97f941530ccaab09ccfd3ca Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 20 Oct 2024 17:15:13 -0500 Subject: [PATCH 1/2] Put seclist nodes in LevelPool memory Replaces the old freelist solution with the LevelPool, which dramatically reduces the number of allocations needed for mobj and precip sector assignment. In measurement, this cuts down the time taken for spawning precipitation by 50%. --- src/p_map.c | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 503295071..2f7f473e1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2776,7 +2776,7 @@ fixed_t P_GetThingStepUp(mobj_t *thing, fixed_t destX, fixed_t destY) maxstep += abs(momentumzdelta); // if (thing->player) // CONS_Printf(" %d = %d\n", momentumzdelta, maxstep); - + } if (P_MobjTouchingSectorSpecialFlag(thing, SSF_DOUBLESTEPUP) @@ -2979,7 +2979,7 @@ increment_move } else if (g_tm.floorz - g_tm.dropoffz > maxstep) return false; // don't stand over a dropoff - } + } } } while (tryx != x || tryy != y); @@ -4642,13 +4642,8 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) Lots of new Boom functions that work faster and add functionality. */ -static msecnode_t *headsecnode = NULL; -static mprecipsecnode_t *headprecipsecnode = NULL; - void P_Initsecnode(void) { - headsecnode = NULL; - headprecipsecnode = NULL; } // P_GetSecnode() retrieves a node from the freelist. The calling routine @@ -4656,45 +4651,25 @@ void P_Initsecnode(void) static msecnode_t *P_GetSecnode(void) { - msecnode_t *node; - - if (headsecnode) - { - node = headsecnode; - headsecnode = headsecnode->m_thinglist_next; - } - else - node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); - return node; + return Z_LevelPoolCalloc(sizeof(msecnode_t)); } static mprecipsecnode_t *P_GetPrecipSecnode(void) { - mprecipsecnode_t *node; - - if (headprecipsecnode) - { - node = headprecipsecnode; - headprecipsecnode = headprecipsecnode->m_thinglist_next; - } - else - node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); - return node; + return Z_LevelPoolCalloc(sizeof(mprecipsecnode_t)); } // P_PutSecnode() returns a node to the freelist. static inline void P_PutSecnode(msecnode_t *node) { - node->m_thinglist_next = headsecnode; - headsecnode = node; + Z_LevelPoolFree(node, sizeof(msecnode_t)); } // Tails 08-25-2002 static inline void P_PutPrecipSecnode(mprecipsecnode_t *node) { - node->m_thinglist_next = headprecipsecnode; - headprecipsecnode = node; + Z_LevelPoolFree(node, sizeof(mprecipsecnode_t)); } // P_AddSecnode() searches the current list to see if this sector is From aab0465fab64090b4039b5c5cc0417bae64cafdf Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 20 Oct 2024 20:26:56 -0500 Subject: [PATCH 2/2] Put taglists in LevelPool memory --- src/taglist.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/taglist.c b/src/taglist.c index 3421326a5..acd2b6aa3 100644 --- a/src/taglist.c +++ b/src/taglist.c @@ -31,9 +31,18 @@ taggroup_t* tags_lines[MAXTAGS + 1]; /// \warning This does not rebuild the global taggroups, which are used for iteration. void Tag_Add (taglist_t* list, const mtag_t tag) { + mtag_t *oldlist; + mtag_t *newlist; if (Tag_Find(list, tag)) return; - list->tags = Z_Realloc(list->tags, (list->count + 1) * sizeof(mtag_t), PU_LEVEL, NULL); + oldlist = list->tags; + newlist = Z_LevelPoolMalloc((list->count + 1) * sizeof(mtag_t)); + if (oldlist) + { + memcpy(newlist, oldlist, list->count * sizeof(mtag_t)); + Z_LevelPoolFree(oldlist, list->count * sizeof(mtag_t)); + } + list->tags = newlist; list->tags[list->count++] = tag; } @@ -45,13 +54,17 @@ void Tag_Remove(taglist_t* list, const mtag_t tag) for (i = 0; i < list->count; i++) { + mtag_t *newlist; if (list->tags[i] != tag) continue; for (; i+1 < list->count; i++) list->tags[i] = list->tags[i+1]; - list->tags = Z_Realloc(list->tags, (list->count - 1) * sizeof(mtag_t), PU_LEVEL, NULL); + newlist = Z_LevelPoolMalloc((list->count - 1) * sizeof(mtag_t)); + memcpy(newlist, list->tags, (list->count) * sizeof(mtag_t)); + Z_LevelPoolFree(list->tags, (list->count) * sizeof(mtag_t)); + list->tags = newlist; return; } }