From 32432e964a2096d912e7500738d9e1bf1d7925db Mon Sep 17 00:00:00 2001 From: divverent Date: Wed, 23 Jul 2008 11:25:52 +0000 Subject: [PATCH] optimize many loops over expandable arrays by not repeatedly calling Mem_ExpandableArray_IndexRange (patch by Blub) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8424 d7cf8633-e32d-0410-b094-e92efae38249 --- r_shadow.c | 36 +++++++++++++++++++++++++----------- wad.c | 4 +++- zone.c | 11 ++++++++++- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/r_shadow.c b/r_shadow.c index 4864bb86..22bb8913 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -2560,7 +2560,8 @@ void R_Shadow_UncompileWorldLights(void) { size_t lightindex; dlight_t *light; - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + size_t range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (!light) @@ -3128,6 +3129,7 @@ void R_ShadowVolumeLighting(qboolean visible) int lnum; size_t lightindex; dlight_t *light; + size_t range; if (r_editlights.integer) R_Shadow_DrawLightSprites(); @@ -3144,7 +3146,8 @@ void R_ShadowVolumeLighting(qboolean visible) } else { - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (light && (light->flags & flag)) @@ -3253,12 +3256,14 @@ void R_DrawCoronas(void) size_t lightindex; dlight_t *light; rtlight_t *rtlight; + size_t range; if (r_coronas.value < (1.0f / 256.0f) && !gl_flashblend.integer) return; R_Mesh_Matrix(&identitymatrix); flag = r_refdef.scene.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE; // FIXME: these traces should scan all render entities instead of cl.world - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (!light) @@ -3494,7 +3499,8 @@ void R_Shadow_ClearWorldLights(void) { size_t lightindex; dlight_t *light; - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + size_t range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (light) @@ -3557,7 +3563,8 @@ void R_Shadow_DrawLightSprites(void) { size_t lightindex; dlight_t *light; - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + size_t range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (light) @@ -3572,9 +3579,10 @@ void R_Shadow_SelectLightInView(void) dlight_t *best; size_t lightindex; dlight_t *light; + size_t range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked best = NULL; bestrating = 0; - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (!light) @@ -3706,7 +3714,9 @@ void R_Shadow_SaveWorldLights(void) char *buf, *oldbuf; char name[MAX_QPATH]; char line[MAX_INPUTLINE]; - if (!Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray)) + size_t range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked, assuming the dpsnprintf mess doesn't screw it up... + // I hate lines which are 3 times my screen size :( --blub + if (!range) return; if (cl.worldmodel == NULL) { @@ -3717,7 +3727,7 @@ void R_Shadow_SaveWorldLights(void) strlcat (name, ".rtlights", sizeof (name)); bufchars = bufmaxchars = 0; buf = NULL; - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (!light) @@ -4434,6 +4444,7 @@ void R_Shadow_EditLights_EditAll_f(void) { size_t lightindex; dlight_t *light; + size_t range; if (!r_editlights.integer) { @@ -4441,7 +4452,9 @@ void R_Shadow_EditLights_EditAll_f(void) return; } - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + // EditLights doesn't seem to have a "remove" command or something so: + range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (!light) @@ -4454,7 +4467,7 @@ void R_Shadow_EditLights_EditAll_f(void) void R_Shadow_EditLights_DrawSelectedLightProperties(void) { int lightnumber, lightcount; - size_t lightindex; + size_t lightindex, range; dlight_t *light; float x, y; char temp[256]; @@ -4465,7 +4478,8 @@ void R_Shadow_EditLights_DrawSelectedLightProperties(void) DrawQ_Pic(x-5, y-5, NULL, 250, 155, 0, 0, 0, 0.75, 0); lightnumber = -1; lightcount = 0; - for (lightindex = 0;lightindex < Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);lightindex++) + range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked + for (lightindex = 0;lightindex < range;lightindex++) { light = Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex); if (!light) diff --git a/wad.c b/wad.c index 23c0b6e6..25dd95cf 100644 --- a/wad.c +++ b/wad.c @@ -255,12 +255,14 @@ unsigned char *W_GetTextureBGRA(char *name) unsigned char *data; mwad_t *w; char texname[17]; + size_t range; texname[16] = 0; W_CleanupName(name, texname); if (!wad.hlwads.mempool) Mem_ExpandableArray_NewArray(&wad.hlwads, cls.permanentmempool, sizeof(mwad_t), 16); - for (k = 0;k < Mem_ExpandableArray_IndexRange(&wad.hlwads);k++) + range = Mem_ExpandableArray_IndexRange(&wad.hlwads); + for (k = 0;k < range;k++) { w = (mwad_t *)Mem_ExpandableArray_RecordAtIndex(&wad.hlwads, k); if (!w) diff --git a/zone.c b/zone.c index 41e9ee07..0895f522 100644 --- a/zone.c +++ b/zone.c @@ -439,7 +439,16 @@ void *Mem_ExpandableArray_AllocRecord(memexpandablearray_t *l) } } -void Mem_ExpandableArray_FreeRecord(memexpandablearray_t *l, void *record) +/***************************************************************************** + * IF YOU EDIT THIS: + * If this function was to change the size of the "expandable" array, you have + * to update r_shadow.c + * Just do a search for "range =", R_ShadowClearWorldLights would be the first + * function to look at. (And also seems like the only one?) You might have to + * move the call to Mem_ExpandableArray_IndexRange back into for(...) loop's + * condition + */ +void Mem_ExpandableArray_FreeRecord(memexpandablearray_t *l, void *record) // const! { size_t i, j; unsigned char *p = (unsigned char *)record; -- 2.39.2