Skip to content

Commit d312566

Browse files
DJMcNabjames7132
authored andcommitted
Extract resources into their target location (bevyengine#5271)
# Objective - Extracting resources currently always uses commands, which requires *at least* one additional move of the extracted value, as well as dynamic dispatch. - Addresses bevyengine#4402 (comment) ## Solution - Write the resource into a `ResMut<R>` directly. - Fall-back to commands if the resource hasn't been added yet.
1 parent 4fd6969 commit d312566

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

crates/bevy_render/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ bevy_core = { path = "../bevy_core", version = "0.8.0-dev" }
3434
bevy_derive = { path = "../bevy_derive", version = "0.8.0-dev" }
3535
bevy_ecs = { path = "../bevy_ecs", version = "0.8.0-dev" }
3636
bevy_encase_derive = { path = "../bevy_encase_derive", version = "0.8.0-dev" }
37+
bevy_log = { path = "../bevy_log", version = "0.8.0-dev" }
3738
bevy_math = { path = "../bevy_math", version = "0.8.0-dev" }
3839
bevy_mikktspace = { path = "../bevy_mikktspace", version = "0.8.0-dev" }
3940
bevy_reflect = { path = "../bevy_reflect", version = "0.8.0-dev", features = ["bevy"] }

crates/bevy_render/src/extract_resource.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::marker::PhantomData;
22

33
use bevy_app::{App, Plugin};
4-
use bevy_ecs::system::{Commands, Res, Resource};
4+
use bevy_ecs::system::{Commands, Local, Res, ResMut, Resource};
55
pub use bevy_render_macros::ExtractResource;
66

77
use crate::{Extract, RenderApp, RenderStage};
@@ -38,12 +38,26 @@ impl<R: ExtractResource> Plugin for ExtractResourcePlugin<R> {
3838
}
3939

4040
/// This system extracts the resource of the corresponding [`Resource`] type
41-
/// by cloning it.
4241
pub fn extract_resource<R: ExtractResource>(
4342
mut commands: Commands,
44-
resource: Extract<Res<R::Source>>,
43+
main_resource: Extract<Res<R::Source>>,
44+
target_resource: Option<ResMut<R>>,
45+
#[cfg(debug_assertions)] mut has_warned_on_remove: Local<bool>,
4546
) {
46-
if resource.is_changed() {
47-
commands.insert_resource(R::extract_resource(&*resource));
47+
if let Some(mut target_resource) = target_resource {
48+
if main_resource.is_changed() {
49+
*target_resource = R::extract_resource(&*main_resource);
50+
}
51+
} else {
52+
#[cfg(debug_assertions)]
53+
if !main_resource.is_added() && !*has_warned_on_remove {
54+
*has_warned_on_remove = true;
55+
bevy_log::warn!(
56+
"Removing resource {} from render world not expected, adding using `Commands`.
57+
This may decrease performance",
58+
std::any::type_name::<R>()
59+
);
60+
}
61+
commands.insert_resource(R::extract_resource(&*main_resource));
4862
}
4963
}

0 commit comments

Comments
 (0)