Cache the result of GetImage() in Vehicle::UpdateViewport() where possible.

Sprite number is not cached if callback is made, or a variable access
outside a whitelist occurs.
Invalidate cached sprite number when direction or cargo changes,
or vehicle is marked dirty.
This commit is contained in:
Jonathan G Rennison
2016-07-08 19:07:25 +01:00
parent 9ae057b8bf
commit 3ac94e97c8
9 changed files with 65 additions and 1 deletions

View File

@@ -237,6 +237,8 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ScopeResolver
}
}
bool _sprite_group_resolve_check_veh_enable = false;
bool _sprite_group_resolve_check_veh_result = false;
const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) const
{
@@ -252,6 +254,7 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con
/* Try to get the variable. We shall assume it is available, unless told otherwise. */
bool available = true;
if (adjust->variable == 0x7E) {
_sprite_group_resolve_check_veh_result = false;
const SpriteGroup *subgroup = SpriteGroup::Resolve(adjust->subroutine, object, false);
if (subgroup == NULL) {
value = CALLBACK_FAILED;
@@ -261,8 +264,49 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con
/* Note: 'last_value' and 'reseed' are shared between the main chain and the procedure */
} else if (adjust->variable == 0x7B) {
_sprite_group_resolve_check_veh_result = false;
value = GetVariable(object, scope, adjust->parameter, last_value, &available);
} else {
if (_sprite_group_resolve_check_veh_enable) {
switch (adjust->variable) {
// whitelist of variables which can be checked without requiring an immediate re-check on the next tick
case 0xC:
case 0x1A:
case 0x1C:
case 0x25:
case 0x40:
case 0x41:
case 0x42:
case 0x47:
case 0x49:
case 0x4B:
case 0x4D:
case 0x60:
case 0x7D:
case 0x7F:
case 0x80 + 0x0:
case 0x80 + 0x1:
case 0x80 + 0x4:
case 0x80 + 0x5:
case 0x80 + 0x39:
case 0x80 + 0x3A:
case 0x80 + 0x3B:
case 0x80 + 0x3C:
case 0x80 + 0x3D:
case 0x80 + 0x44:
case 0x80 + 0x45:
case 0x80 + 0x46:
case 0x80 + 0x47:
case 0x80 + 0x5A:
case 0x80 + 0x72:
case 0x80 + 0x7A:
break;
default:
_sprite_group_resolve_check_veh_result = false;
break;
}
}
value = GetVariable(object, scope, adjust->variable, adjust->parameter, &available);
}