gltf loader: do not use the taskpool for only one task (#3577)

# Objective

- Fix the case mentioned in https://github.com/bevyengine/bevy/pull/2725#issuecomment-1007014024.
- On a machine with 4 cores, so 1 thread for assets, loading a gltf with only one textures hangs all asset loading

## Solution

- Do not use the task pool when there is only one texture to load


Co-authored-by: François <8672791+mockersf@users.noreply.github.com>
This commit is contained in:
François 2022-01-07 07:19:22 +00:00
parent fda0b2c911
commit 015da72250

View File

@ -247,13 +247,16 @@ async fn load_gltf<'a, 'b>(
.collect(); .collect();
// TODO: use the threaded impl on wasm once wasm thread pool doesn't deadlock on it // TODO: use the threaded impl on wasm once wasm thread pool doesn't deadlock on it
#[cfg(target_arch = "wasm32")] // See https://github.com/bevyengine/bevy/issues/1924 for more details
// The taskpool use is also avoided when there is only one texture for performance reasons and
// to avoid https://github.com/bevyengine/bevy/pull/2725
if gltf.textures().len() == 1 || cfg!(target_arch = "wasm32") {
for gltf_texture in gltf.textures() { for gltf_texture in gltf.textures() {
let (texture, label) = let (texture, label) =
load_texture(gltf_texture, &buffer_data, &linear_textures, &load_context).await?; load_texture(gltf_texture, &buffer_data, &linear_textures, load_context).await?;
load_context.set_labeled_asset(&label, LoadedAsset::new(texture)); load_context.set_labeled_asset(&label, LoadedAsset::new(texture));
} }
} else {
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
load_context load_context
.task_pool() .task_pool()
@ -277,6 +280,7 @@ async fn load_gltf<'a, 'b>(
.for_each(|(texture, label)| { .for_each(|(texture, label)| {
load_context.set_labeled_asset(&label, LoadedAsset::new(texture)); load_context.set_labeled_asset(&label, LoadedAsset::new(texture));
}); });
}
let mut scenes = vec![]; let mut scenes = vec![];
let mut named_scenes = HashMap::default(); let mut named_scenes = HashMap::default();