Changeset - r7230:fb11136969fa
[Not reviewed]
master
0 1 0
peter1138 - 17 years ago 2007-07-11 16:37:20
peter1138@openttd.org
(svn r10509) -Codechange: cache expensive newgrf station variables during
sprite lookups/callbacks.
1 file changed with 40 insertions and 6 deletions:
0 comments (0 inline, 0 general)
src/newgrf_station.cpp
Show inline comments
 
@@ -345,6 +345,20 @@ static void StationSetTriggers(const Res
 
	st->waiting_triggers = triggers;
 
}
 

	
 
/**
 
 * Station variable cache
 
 * This caches 'expensive' station variable lookups which iterate over
 
 * several tiles that may be called multiple times per Resolve().
 
 */
 
static struct {
 
	uint32 v40;
 
	uint32 v41;
 
	uint32 v45;
 
	uint32 v46;
 
	uint32 v47;
 
	uint32 v49;
 
	uint8 valid;
 
} _svc;
 

	
 
static uint32 StationGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
 
{
 
@@ -387,14 +401,29 @@ static uint32 StationGetVariable(const R
 

	
 
	switch (variable) {
 
		/* Calculated station variables */
 
		case 0x40: return GetPlatformInfoHelper(tile, false, false, false);
 
		case 0x41: return GetPlatformInfoHelper(tile, true,  false, false);
 
		case 0x40:
 
			if (!HASBIT(_svc.valid, 0)) { _svc.v40 = GetPlatformInfoHelper(tile, false, false, false); SETBIT(_svc.valid, 0); }
 
			return _svc.v40;
 

	
 
		case 0x41:
 
			if (!HASBIT(_svc.valid, 1)) { _svc.v41 = GetPlatformInfoHelper(tile, true,  false, false); SETBIT(_svc.valid, 1); }
 
			return _svc.v41;
 

	
 
		case 0x42: return GetTerrainType(tile) | (GetRailType(tile) << 8);
 
		case 0x43: return st->owner; // Station owner
 
		case 0x44: return 2;         // PBS status
 
		case 0x45: return GetRailContinuationInfo(tile);
 
		case 0x46: return GetPlatformInfoHelper(tile, false, false, true);
 
		case 0x47: return GetPlatformInfoHelper(tile, true,  false, true);
 
		case 0x45:
 
			if (!HASBIT(_svc.valid, 2)) { _svc.v45 = GetRailContinuationInfo(tile); SETBIT(_svc.valid, 2); }
 
			return _svc.v45;
 

	
 
		case 0x46:
 
			if (!HASBIT(_svc.valid, 3)) { _svc.v46 = GetPlatformInfoHelper(tile, false, false, true); SETBIT(_svc.valid, 3); }
 
			return _svc.v46;
 

	
 
		case 0x47:
 
			if (!HASBIT(_svc.valid, 4)) { _svc.v47 = GetPlatformInfoHelper(tile, true,  false, true); SETBIT(_svc.valid, 4); }
 
			return _svc.v47;
 

	
 
		case 0x48: { // Accepted cargo types
 
			CargoID cargo_type;
 
			uint32 value = 0;
 
@@ -404,7 +433,9 @@ static uint32 StationGetVariable(const R
 
			}
 
			return value;
 
		}
 
		case 0x49: return GetPlatformInfoHelper(tile, false, true, false);
 
		case 0x49:
 
			if (!HASBIT(_svc.valid, 5)) { _svc.v49 = GetPlatformInfoHelper(tile, false, true, false); SETBIT(_svc.valid, 5); }
 
			return _svc.v49;
 

	
 
		/* Variables which use the parameter */
 
		/* Variables 0x60 to 0x65 are handled separately below */
 
@@ -563,6 +594,9 @@ static const SpriteGroup *ResolveStation
 
	/* Remember the cargo type we've picked */
 
	object->u.station.cargo_type = ctype;
 

	
 
	/* Invalidate all cached vars */
 
	_svc.valid = 0;
 

	
 
	return Resolve(group, object);
 
}
 

	
0 comments (0 inline, 0 general)