From 2b3749d2f46812f62842fe374ea0fb59db55df23 Mon Sep 17 00:00:00 2001 From: scott-c Date: Sat, 7 Sep 2019 17:29:26 +0800 Subject: [PATCH] Fix performance regression; simplify FigureKey --- voxygen/src/scene/figure/cache.rs | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index 967a218910..b91498d9cf 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -6,14 +6,35 @@ use crate::{ }; use common::{ assets::watch::ReloadIndicator, - comp::{Body, CharacterState, Equipment}, + comp::{ActionState, Body, CharacterState, Equipment, MovementState}, }; use hashbrown::HashMap; +use std::mem::{discriminant, Discriminant}; #[derive(PartialEq, Eq, Hash, Clone)] enum FigureKey { Simple(Body), - Complex(Body, Option, CameraMode, Option), + Complex( + Body, + Option, + CameraMode, + Option, + ), +} + +#[derive(PartialEq, Eq, Hash, Clone)] +struct CharacterStateCacheKey { + movement: Discriminant, + action: Discriminant, +} + +impl From<&CharacterState> for CharacterStateCacheKey { + fn from(cs: &CharacterState) -> Self { + Self { + movement: discriminant(&cs.movement), + action: discriminant(&cs.action), + } + } } pub struct FigureModelCache { @@ -43,7 +64,7 @@ impl FigureModelCache { body, equipment.cloned(), camera_mode, - character_state.cloned(), + character_state.map(|cs| CharacterStateCacheKey::from(cs)), ) } else { FigureKey::Simple(body)