From 249b6e679843ff2ba2c11878f8fcf64024489820 Mon Sep 17 00:00:00 2001 From: smatz Date: Tue, 9 Jun 2009 17:20:06 +0000 Subject: [PATCH] (svn r16544) -Codechange: use double-linked list for vehicle position caches in order to improve performance (~5% with many vehicles) --- src/vehicle.cpp | 35 ++++++++--------------------------- src/vehicle_base.h | 4 ++-- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 8a1b649a63..c5c72f1518 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -375,26 +375,16 @@ static void UpdateNewVehiclePosHash(Vehicle *v, bool remove) /* Remove from the old position in the hash table */ if (old_hash != NULL) { - Vehicle *last = NULL; - Vehicle *u = *old_hash; - while (u != v) { - last = u; - u = u->next_new_hash; - assert(u != NULL); - } - - if (last == NULL) { - *old_hash = v->next_new_hash; - } else { - last->next_new_hash = v->next_new_hash; - } + if (v->next_new_hash != NULL) v->next_new_hash->prev_new_hash = v->prev_new_hash; + *v->prev_new_hash = v->next_new_hash; } /* Insert vehicle at beginning of the new position in the hash table */ if (new_hash != NULL) { v->next_new_hash = *new_hash; + if (v->next_new_hash != NULL) v->next_new_hash->prev_new_hash = &v->next_new_hash; + v->prev_new_hash = new_hash; *new_hash = v; - assert(v != v->next_new_hash); } /* Remember current hash position */ @@ -418,24 +408,15 @@ static void UpdateVehiclePosHash(Vehicle *v, int x, int y) /* remove from hash table? */ if (old_hash != NULL) { - Vehicle *last = NULL; - Vehicle *u = *old_hash; - while (u != v) { - last = u; - u = u->next_hash; - assert(u != NULL); - } - - if (last == NULL) { - *old_hash = v->next_hash; - } else { - last->next_hash = v->next_hash; - } + if (v->next_hash != NULL) v->next_hash->prev_hash = v->prev_hash; + *v->prev_hash = v->next_hash; } /* insert into hash table? */ if (new_hash != NULL) { v->next_hash = *new_hash; + if (v->next_hash != NULL) v->next_hash->prev_hash = &v->next_hash; + v->prev_hash = new_hash; *new_hash = v; } } diff --git a/src/vehicle_base.h b/src/vehicle_base.h index b5e7a16f56..795e48a71c 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -100,8 +100,8 @@ public: /* Boundaries for the current position in the world and a next hash link. * NOSAVE: All of those can be updated with VehiclePositionChanged() */ Rect coord; - Vehicle *next_hash; - Vehicle *next_new_hash; + Vehicle *next_hash, **prev_hash; + Vehicle *next_new_hash, **prev_new_hash; Vehicle **old_new_hash; SpriteID colourmap; // NOSAVE: cached colour mapping