(svn r2105) -Codechange: Added a cache for the first vehicle of a chain to increase performance, especially with many long trains
authorcelestar
Tue, 29 Mar 2005 11:19:10 +0000
changeset 1601 9fd461d00287
parent 1600 b2bd1eaed056
child 1602 08783e4287dc
(svn r2105) -Codechange: Added a cache for the first vehicle of a chain to increase performance, especially with many long trains
train_cmd.c
vehicle.c
vehicle.h
--- a/train_cmd.c	Tue Mar 29 08:37:44 2005 +0000
+++ b/train_cmd.c	Tue Mar 29 11:19:10 2005 +0000
@@ -736,6 +736,14 @@
 	dst_head = NULL;
 	if (dst != NULL) dst_head = GetFirstVehicleInChain(dst);
 
+	/* clear the ->first cache */
+	{
+		Vehicle *u;
+
+		for (u = src_head; u != NULL; u = u->next) u->first = NULL;
+		for (u = dst_head; u != NULL; u = u->next) u->first = NULL;
+	}
+
 	/* check if all vehicles in the source train are stopped */
 	if (CheckTrainStoppedInDepot(src_head) < 0)
 		return CMD_ERROR;
@@ -939,6 +947,9 @@
 
 		// when selling an attached locomotive. we need to delete its window.
 		if (v->subtype == TS_Front_Engine) {
+			Vehicle *u;
+
+			for (u = v; u != NULL; u = u->next) u->first = NULL;
 			DeleteWindowById(WC_VEHICLE_VIEW, v->index);
 
 			// rearrange all vehicles that follow to separate lines.
--- a/vehicle.c	Tue Mar 29 08:37:44 2005 +0000
+++ b/vehicle.c	Tue Mar 29 11:19:10 2005 +0000
@@ -14,6 +14,7 @@
 #include "player.h"
 #include "engine.h"
 #include "sound.h"
+#include "debug.h"
 
 #define INVALID_COORD (-0x8000)
 #define GEN_HASH(x,y) (((x & 0x1F80)>>7) + ((y & 0xFC0)))
@@ -165,6 +166,7 @@
 	Vehicle *v;
 
 	FOR_ALL_VEHICLES(v) {
+		v->first = NULL;
 		if (v->type != 0) {
 			v->left_coord = INVALID_COORD;
 			VehiclePositionChanged(v);
@@ -186,6 +188,7 @@
 	assert(v->orders == NULL);
 
 	v->left_coord = INVALID_COORD;
+	v->first = NULL;
 	v->next = NULL;
 	v->next_hash = 0xffff;
 	v->string_id = 0;
@@ -352,10 +355,21 @@
 
 Vehicle *GetFirstVehicleInChain(const Vehicle *v)
 {
-	const Vehicle* u;
+	Vehicle* u;
+
+	if (v->first != NULL) {
+		if (v->first->subtype == TS_Front_Engine) {
+			return v->first;
+		} else {
+			DEBUG(misc, 0) ("v->first cache faulty. We shouldn't be here");
+		}
+	}
 
 	while ((u = GetPrevVehicleInChain(v)) != NULL) v = u;
 
+	if (v->subtype == TS_Front_Engine)
+		for (u = (Vehicle *)v; u != NULL; u = u->next) u->first = (Vehicle *)v;
+
 	return (Vehicle*)v;
 }
 
--- a/vehicle.h	Tue Mar 29 08:37:44 2005 +0000
+++ b/vehicle.h	Tue Mar 29 11:19:10 2005 +0000
@@ -97,6 +97,7 @@
 	uint16 index;			// NOSAVE: Index in vehicle array
 
 	Vehicle *next;		// next
+	Vehicle *first;   // NOSAVE: pointer to the first vehicle in the chain
 
 	StringID string_id; // Displayed string