summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcelestar <celestar@openttd.org>2005-03-29 11:19:10 +0000
committercelestar <celestar@openttd.org>2005-03-29 11:19:10 +0000
commitc68cfdeecaccbd3979e920ec424f98375e0f9e3d (patch)
treec9bca484f8c447d1e5c5e7e8827b416361992ea3
parent3a8665f796876a7dd346887cae7d7df4808ee4d4 (diff)
downloadopenttd-c68cfdeecaccbd3979e920ec424f98375e0f9e3d.tar.xz
(svn r2105) -Codechange: Added a cache for the first vehicle of a chain to increase performance, especially with many long trains
-rw-r--r--train_cmd.c11
-rw-r--r--vehicle.c16
-rw-r--r--vehicle.h1
3 files changed, 27 insertions, 1 deletions
diff --git a/train_cmd.c b/train_cmd.c
index 512930b28..0a49aea89 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -736,6 +736,14 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
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 @@ int32 CmdSellRailWagon(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// 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.
diff --git a/vehicle.c b/vehicle.c
index d2186e4da..dba2a2abc 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -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 @@ void AfterLoadVehicles(void)
Vehicle *v;
FOR_ALL_VEHICLES(v) {
+ v->first = NULL;
if (v->type != 0) {
v->left_coord = INVALID_COORD;
VehiclePositionChanged(v);
@@ -186,6 +188,7 @@ static Vehicle *InitializeVehicle(Vehicle *v)
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 *GetPrevVehicleInChain(const Vehicle *v)
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;
}
diff --git a/vehicle.h b/vehicle.h
index 2eb585c66..5e822aa6c 100644
--- a/vehicle.h
+++ b/vehicle.h
@@ -97,6 +97,7 @@ struct Vehicle {
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