From ad1bccfee009a1b83c05d98cacffe8b6922b60cd Mon Sep 17 00:00:00 2001 From: scott-c Date: Sun, 18 Aug 2019 21:19:32 +0800 Subject: [PATCH] Simplify model cache key, fixes performance issue --- voxygen/src/menu/char_selection/scene.rs | 2 +- voxygen/src/scene/figure/cache.rs | 27 ++++++++---------- voxygen/src/scene/figure/mod.rs | 36 +++++++++++++----------- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/voxygen/src/menu/char_selection/scene.rs b/voxygen/src/menu/char_selection/scene.rs index 6607c17b29..cdc6471d5e 100644 --- a/voxygen/src/menu/char_selection/scene.rs +++ b/voxygen/src/menu/char_selection/scene.rs @@ -164,7 +164,7 @@ impl Scene { Body::Humanoid(body), Some(equipment), client.get_tick(), - None, + CameraMode::default(), None, ) .0; diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index 1df51fdb90..97182b9ad7 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -13,12 +13,7 @@ use hashbrown::HashMap; #[derive(PartialEq, Eq, Hash, Clone)] enum FigureKey { Simple(Body), - Complex( - Body, - Option, - Option, - Option, - ), + Complex(Body, Option, CameraMode, Option), } pub struct FigureModelCache { @@ -40,7 +35,7 @@ impl FigureModelCache { body: Body, equipment: Option<&Equipment>, tick: u64, - camera_mode: Option, + camera_mode: CameraMode, character_state: Option<&CharacterState>, ) -> &(Model, SkeletonAttr) { let key = if equipment.is_some() { @@ -67,7 +62,7 @@ impl FigureModelCache { HumHeadSpec::load_watched(&mut self.manifest_indicator); let bone_meshes = match body { Body::Humanoid(body) => [ - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => { Some(humanoid_head_spec.mesh_head( body.race, @@ -83,29 +78,29 @@ impl FigureModelCache { } CameraMode::FirstPerson => None, }, - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => Some(mesh_chest(body.chest)), CameraMode::FirstPerson => None, }, - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => Some(mesh_belt(body.belt)), CameraMode::FirstPerson => None, }, - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => Some(mesh_pants(body.pants)), CameraMode::FirstPerson => None, }, Some(mesh_left_hand(body.hand)), Some(mesh_right_hand(body.hand)), - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => Some(mesh_left_foot(body.foot)), CameraMode::FirstPerson => None, }, - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => Some(mesh_right_foot(body.foot)), CameraMode::FirstPerson => None, }, - if camera_mode.unwrap_or_default() != CameraMode::FirstPerson + if camera_mode != CameraMode::FirstPerson || character_state .map(|cs| { cs.action.is_attack() @@ -118,13 +113,13 @@ impl FigureModelCache { } else { None }, - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => { Some(mesh_left_shoulder(body.shoulder)) } CameraMode::FirstPerson => None, }, - match camera_mode.unwrap_or_default() { + match camera_mode { CameraMode::ThirdPerson => { Some(mesh_right_shoulder(body.shoulder)) } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index f516df3a51..a726dc8851 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -121,7 +121,7 @@ impl FigureMgr { *body, stats.map(|s| &s.equipment), tick, - None, + CameraMode::default(), None, ) .1; @@ -348,6 +348,11 @@ impl FigureMgr { let frustum = camera.frustum(client); + let character_state_storage = client + .state() + .read_storage::(); + let character_state = character_state_storage.get(client.entity()); + for (entity, _, _, _, body, stats, _) in ( &ecs.entities(), &ecs.read_storage::(), @@ -389,22 +394,19 @@ impl FigureMgr { .map(|state| (state.locals(), state.bone_consts())), } { // Don't render the player's body while in first person mode - let player_camera_mode = if client - .state() - .read_storage::() - .get(client.entity()) - .is_some() - && entity == client.entity() - { - Some(camera.get_mode()) - } else { - None - }; + // let has_body = client + // .state() + // .read_storage::() + // .get(client.entity()) + // .is_some(); - let character_state_storage = client - .state() - .read_storage::(); - let character_state = character_state_storage.get(client.entity()); + let is_player = entity == client.entity(); + + let player_camera_mode = if is_player { + camera.get_mode() + } else { + CameraMode::default() + }; let model = &self .model_cache @@ -414,7 +416,7 @@ impl FigureMgr { stats.map(|s| &s.equipment), tick, player_camera_mode, - character_state, + if is_player { character_state } else { None }, ) .0;