
This PR makes Bevy keep entities in bins from frame to frame if they haven't changed. This reduces the time spent in `queue_material_meshes` and related functions to near zero for static geometry. This patch uses the same change tick technique that #17567 uses to detect when meshes have changed in such a way as to require re-binning. In order to quickly find the relevant bin for an entity when that entity has changed, we introduce a new type of cache, the *bin key cache*. This cache stores a mapping from main world entity ID to cached bin key, as well as the tick of the most recent change to the entity. As we iterate through the visible entities in `queue_material_meshes`, we check the cache to see whether the entity needs to be re-binned. If it doesn't, then we mark it as clean in the `valid_cached_entity_bin_keys` bit set. If it does, then we insert it into the correct bin, and then mark the entity as clean. At the end, all entities not marked as clean are removed from the bins. This patch has a dramatic effect on the rendering performance of most benchmarks, as it effectively eliminates `queue_material_meshes` from the profile. Note, however, that it generally simultaneously regresses `batch_and_prepare_binned_render_phase` by a bit (not by enough to outweigh the win, however). I believe that's because, before this patch, `queue_material_meshes` put the bins in the CPU cache for `batch_and_prepare_binned_render_phase` to use, while with this patch, `batch_and_prepare_binned_render_phase` must load the bins into the CPU cache itself. On Caldera, this reduces the time spent in `queue_material_meshes` from 5+ ms to 0.2ms-0.3ms. Note that benchmarking on that scene is very noisy right now because of https://github.com/bevyengine/bevy/issues/17535. 
134 lines
4.5 KiB
TOML
134 lines
4.5 KiB
TOML
[package]
|
|
name = "bevy_render"
|
|
version = "0.16.0-dev"
|
|
edition = "2021"
|
|
description = "Provides rendering functionality for Bevy Engine"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["bevy"]
|
|
|
|
[features]
|
|
# Texture formats (require more than just image support)
|
|
basis-universal = ["bevy_image/basis-universal"]
|
|
dds = ["bevy_image/dds"]
|
|
exr = ["bevy_image/exr"]
|
|
hdr = ["bevy_image/hdr"]
|
|
ktx2 = ["dep:ktx2", "bevy_image/ktx2"]
|
|
|
|
multi_threaded = ["bevy_tasks/multi_threaded"]
|
|
|
|
shader_format_glsl = ["naga/glsl-in", "naga/wgsl-out", "naga_oil/glsl"]
|
|
shader_format_spirv = ["wgpu/spirv", "naga/spv-in", "naga/spv-out"]
|
|
|
|
# Enable SPIR-V shader passthrough
|
|
spirv_shader_passthrough = ["wgpu/spirv"]
|
|
|
|
trace = ["profiling"]
|
|
tracing-tracy = []
|
|
ci_limits = []
|
|
webgl = ["wgpu/webgl"]
|
|
webgpu = ["wgpu/webgpu"]
|
|
ios_simulator = []
|
|
detailed_trace = []
|
|
|
|
[dependencies]
|
|
# bevy
|
|
bevy_app = { path = "../bevy_app", version = "0.16.0-dev" }
|
|
bevy_asset = { path = "../bevy_asset", version = "0.16.0-dev" }
|
|
bevy_color = { path = "../bevy_color", version = "0.16.0-dev", features = [
|
|
"serialize",
|
|
"wgpu-types",
|
|
] }
|
|
bevy_derive = { path = "../bevy_derive", version = "0.16.0-dev" }
|
|
bevy_diagnostic = { path = "../bevy_diagnostic", version = "0.16.0-dev" }
|
|
bevy_ecs = { path = "../bevy_ecs", version = "0.16.0-dev" }
|
|
bevy_encase_derive = { path = "../bevy_encase_derive", version = "0.16.0-dev" }
|
|
bevy_math = { path = "../bevy_math", version = "0.16.0-dev" }
|
|
bevy_reflect = { path = "../bevy_reflect", version = "0.16.0-dev", features = [
|
|
"bevy",
|
|
] }
|
|
bevy_render_macros = { path = "macros", version = "0.16.0-dev" }
|
|
bevy_time = { path = "../bevy_time", version = "0.16.0-dev" }
|
|
bevy_transform = { path = "../bevy_transform", version = "0.16.0-dev" }
|
|
bevy_window = { path = "../bevy_window", version = "0.16.0-dev" }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.16.0-dev" }
|
|
bevy_tasks = { path = "../bevy_tasks", version = "0.16.0-dev" }
|
|
bevy_image = { path = "../bevy_image", version = "0.16.0-dev" }
|
|
bevy_mesh = { path = "../bevy_mesh", version = "0.16.0-dev" }
|
|
bevy_platform_support = { path = "../bevy_platform_support", version = "0.16.0-dev", default-features = false, features = [
|
|
"std",
|
|
"serialize",
|
|
] }
|
|
|
|
# rendering
|
|
image = { version = "0.25.2", default-features = false }
|
|
|
|
# misc
|
|
codespan-reporting = "0.11.0"
|
|
# `fragile-send-sync-non-atomic-wasm` feature means we can't use Wasm threads for rendering
|
|
# It is enabled for now to avoid having to do a significant overhaul of the renderer just for wasm.
|
|
# When the 'atomics' feature is enabled `fragile-send-sync-non-atomic` does nothing
|
|
# and Bevy instead wraps `wgpu` types to verify they are not used off their origin thread.
|
|
wgpu = { version = "23.0.1", default-features = false, features = [
|
|
"wgsl",
|
|
"dx12",
|
|
"metal",
|
|
"naga-ir",
|
|
"fragile-send-sync-non-atomic-wasm",
|
|
] }
|
|
naga = { version = "23", features = ["wgsl-in"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
bytemuck = { version = "1.5", features = ["derive", "must_cast"] }
|
|
downcast-rs = { version = "2", default-features = false, features = ["std"] }
|
|
thiserror = { version = "2", default-features = false }
|
|
derive_more = { version = "1", default-features = false, features = ["from"] }
|
|
futures-lite = "2.0.1"
|
|
ktx2 = { version = "0.3.0", optional = true }
|
|
encase = { version = "0.10", features = ["glam"] }
|
|
# For wgpu profiling using tracing. Use `RUST_LOG=info` to also capture the wgpu spans.
|
|
profiling = { version = "1", features = [
|
|
"profile-with-tracing",
|
|
], optional = true }
|
|
async-channel = "2.3.0"
|
|
nonmax = "0.5"
|
|
smallvec = { version = "1.11", features = ["const_new"] }
|
|
offset-allocator = "0.2"
|
|
variadics_please = "1.1"
|
|
tracing = { version = "0.1", default-features = false, features = ["std"] }
|
|
indexmap = { version = "2" }
|
|
fixedbitset = { version = "0.5" }
|
|
|
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
# Omit the `glsl` feature in non-WebAssembly by default.
|
|
naga_oil = { version = "0.16", default-features = false, features = [
|
|
"test_shader",
|
|
] }
|
|
|
|
[dev-dependencies]
|
|
proptest = "1"
|
|
|
|
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
|
naga_oil = "0.16"
|
|
js-sys = "0.3"
|
|
web-sys = { version = "0.3.67", features = [
|
|
'Blob',
|
|
'Document',
|
|
'Element',
|
|
'HtmlElement',
|
|
'Node',
|
|
'Url',
|
|
'Window',
|
|
] }
|
|
wasm-bindgen = "0.2"
|
|
|
|
[target.'cfg(all(target_arch = "wasm32", target_feature = "atomics"))'.dependencies]
|
|
send_wrapper = "0.6.0"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[package.metadata.docs.rs]
|
|
rustdoc-args = ["-Zunstable-options", "--generate-link-to-definition"]
|
|
all-features = true
|