diff --git a/vehicle_gui.c b/vehicle_gui.c --- a/vehicle_gui.c +++ b/vehicle_gui.c @@ -773,19 +773,20 @@ static void ReplaceVehicleWndProc(Window { uint i; const Vehicle *vehicle; + /* compiler optimisation tend to prefer to keep local variables in the registers instead of global ones, + * so we cache often used and unchanging variables in local variables to increase the loop speed */ + const byte vehicle_type = w->window_number; + const PlayerID player = _local_player; for (i = 0; i < lengthof(_player_num_engines); i++) { _player_num_engines[i] = 0; } FOR_ALL_VEHICLES(vehicle) { - if (vehicle->owner == _local_player) { - if (vehicle->type == VEH_Aircraft && vehicle->subtype > 2) continue; - - // do not count the vehicles, that contains only 0 in all var - if (vehicle->engine_type == 0 && vehicle->spritenum == 0) continue; - - if (vehicle->type != GetEngine(vehicle->engine_type)->type) continue; - + if (vehicle->owner == player && vehicle->type == vehicle_type) { + if (vehicle_type == VEH_Aircraft && vehicle->subtype > 2) continue; // plane shadows and helicopter rotors + if (vehicle_type == VEH_Train && ( + IsArticulatedPart(vehicle) || // tenders and other articulated parts + (IsMultiheaded(vehicle) && !IsTrainEngine(vehicle)))) continue; // rear parts of multiheaded engines _player_num_engines[vehicle->engine_type]++; } }