
# Objective
The existing `RelationshipSourceCollection` uses `Vec` as the only
possible backing for our relationships. While a reasonable choice,
benchmarking use cases might reveal that a different data type is better
or faster.
For example:
- Not all relationships require a stable ordering between the
relationship sources (i.e. children). In cases where we a) have many
such relations and b) don't care about the ordering between them, a hash
set is likely a better datastructure than a `Vec`.
- The number of children-like entities may be small on average, and a
`smallvec` may be faster
## Solution
- Implement `RelationshipSourceCollection` for `EntityHashSet`, our
custom entity-optimized `HashSet`.
-~~Implement `DoubleEndedIterator` for `EntityHashSet` to make things
compile.~~
- This implementation was cursed and very surprising.
- Instead, by moving the iterator type on `RelationshipSourceCollection`
from an erased RPTIT to an explicit associated type we can add a trait
bound on the offending methods!
- Implement `RelationshipSourceCollection` for `SmallVec`
## Testing
I've added a pair of new tests to make sure this pattern compiles
successfully in practice!
## Migration Guide
`EntityHashSet` and `EntityHashMap` are no longer re-exported in
`bevy_ecs::entity` directly. If you were not using `bevy_ecs` / `bevy`'s
`prelude`, you can access them through their now-public modules,
`hash_set` and `hash_map` instead.
## Notes to reviewers
The `EntityHashSet::Iter` type needs to be public for this impl to be
allowed. I initially renamed it to something that wasn't ambiguous and
re-exported it, but as @Victoronz pointed out, that was somewhat
unidiomatic.
In
1a8564898f
,
I instead made the `entity_hash_set` public (and its `entity_hash_set`)
sister public, and removed the re-export. I prefer this design (give me
module docs please), but it leads to a lot of churn in this PR.
Let me know which you'd prefer, and if you'd like me to split that
change out into its own micro PR.
162 lines
5.1 KiB
TOML
162 lines
5.1 KiB
TOML
[package]
|
|
name = "bevy_ecs"
|
|
version = "0.16.0-dev"
|
|
edition = "2021"
|
|
description = "Bevy Engine's entity component system"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["ecs", "game", "bevy"]
|
|
categories = ["game-engines", "data-structures"]
|
|
rust-version = "1.83.0"
|
|
|
|
[features]
|
|
default = ["std", "bevy_reflect", "async_executor"]
|
|
|
|
# Functionality
|
|
|
|
## Enables multithreading support. Schedules will attempt to run systems on
|
|
## multiple threads whenever possible.
|
|
multi_threaded = ["bevy_tasks/multi_threaded", "dep:arrayvec"]
|
|
|
|
## Adds serialization support through `serde`.
|
|
serialize = ["dep:serde", "bevy_utils/serde"]
|
|
|
|
## Adds runtime reflection support using `bevy_reflect`.
|
|
bevy_reflect = ["dep:bevy_reflect"]
|
|
|
|
## Extends reflection support to functions.
|
|
reflect_functions = ["bevy_reflect", "bevy_reflect/functions"]
|
|
|
|
## Use the configurable global error handler as the default error handler
|
|
configurable_error_handler = []
|
|
|
|
# Debugging Features
|
|
|
|
## Enables `tracing` integration, allowing spans and other metrics to be reported
|
|
## through that framework.
|
|
trace = ["std", "dep:tracing"]
|
|
|
|
## Enables a more detailed set of traces which may be noisy if left on by default.
|
|
detailed_trace = ["trace"]
|
|
|
|
## Provides system stepping support, allowing them to be paused, stepped, and
|
|
## other debug operations which can help with diagnosing certain behaviors.
|
|
bevy_debug_stepping = []
|
|
|
|
## Provides more detailed tracking of the cause of various effects within the ECS.
|
|
## This will often provide more detailed error messages.
|
|
track_location = []
|
|
|
|
# Executor Backend
|
|
|
|
## Uses `async-executor` as a task execution backend.
|
|
## This backend is incompatible with `no_std` targets.
|
|
async_executor = ["dep:bevy_tasks", "std", "bevy_tasks/async_executor"]
|
|
|
|
## Uses `edge-executor` as a task execution backend.
|
|
## Use this instead of `async-executor` if working on a `no_std` target.
|
|
edge_executor = ["dep:bevy_tasks", "bevy_tasks/edge_executor"]
|
|
|
|
# Platform Compatibility
|
|
|
|
## Allows access to the `std` crate. Enabling this feature will prevent compilation
|
|
## on `no_std` targets, but provides access to certain additional features on
|
|
## supported platforms.
|
|
std = [
|
|
"bevy_reflect?/std",
|
|
"bevy_tasks/std",
|
|
"bevy_utils/std",
|
|
"bitflags/std",
|
|
"concurrent-queue/std",
|
|
"disqualified/alloc",
|
|
"fixedbitset/std",
|
|
"indexmap/std",
|
|
"serde?/std",
|
|
"nonmax/std",
|
|
"arrayvec?/std",
|
|
"log/std",
|
|
"bevy_platform_support/std",
|
|
]
|
|
|
|
## `critical-section` provides the building blocks for synchronization primitives
|
|
## on all platforms, including `no_std`.
|
|
critical-section = [
|
|
"bevy_tasks?/critical-section",
|
|
"bevy_platform_support/critical-section",
|
|
"bevy_reflect?/critical-section",
|
|
]
|
|
|
|
## `portable-atomic` provides additional platform support for atomic types and
|
|
## operations, even on targets without native support.
|
|
portable-atomic = [
|
|
"bevy_tasks?/portable-atomic",
|
|
"bevy_platform_support/portable-atomic",
|
|
"concurrent-queue/portable-atomic",
|
|
"spin/portable_atomic",
|
|
"bevy_reflect?/portable-atomic",
|
|
]
|
|
|
|
[dependencies]
|
|
bevy_ptr = { path = "../bevy_ptr", version = "0.16.0-dev" }
|
|
bevy_reflect = { path = "../bevy_reflect", version = "0.16.0-dev", default-features = false, optional = true }
|
|
bevy_tasks = { path = "../bevy_tasks", version = "0.16.0-dev", default-features = false, optional = true }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.16.0-dev", default-features = false, features = [
|
|
"alloc",
|
|
] }
|
|
bevy_ecs_macros = { path = "macros", version = "0.16.0-dev" }
|
|
bevy_platform_support = { path = "../bevy_platform_support", version = "0.16.0-dev", default-features = false, features = [
|
|
"alloc",
|
|
] }
|
|
|
|
bitflags = { version = "2.3", default-features = false }
|
|
concurrent-queue = { version = "2.5.0", default-features = false }
|
|
disqualified = { version = "1.0", default-features = false }
|
|
fixedbitset = { version = "0.5", default-features = false }
|
|
serde = { version = "1", default-features = false, features = [
|
|
"alloc",
|
|
], optional = true }
|
|
thiserror = { version = "2", default-features = false }
|
|
derive_more = { version = "1", default-features = false, features = [
|
|
"from",
|
|
"display",
|
|
"into",
|
|
"as_ref",
|
|
] }
|
|
nonmax = { version = "0.5", default-features = false }
|
|
arrayvec = { version = "0.7.4", default-features = false, optional = true }
|
|
smallvec = { version = "1", features = ["union", "const_generics"] }
|
|
indexmap = { version = "2.5.0", default-features = false }
|
|
variadics_please = { version = "1.1", default-features = false }
|
|
spin = { version = "0.9.8", default-features = false, features = [
|
|
"spin_mutex",
|
|
"rwlock",
|
|
] }
|
|
tracing = { version = "0.1", default-features = false, optional = true }
|
|
log = { version = "0.4", default-features = false }
|
|
bumpalo = "3"
|
|
|
|
[dev-dependencies]
|
|
rand = "0.8"
|
|
static_assertions = "1.1.0"
|
|
serde_test = "1.0"
|
|
|
|
[[example]]
|
|
name = "events"
|
|
path = "examples/events.rs"
|
|
|
|
[[example]]
|
|
name = "resources"
|
|
path = "examples/resources.rs"
|
|
|
|
[[example]]
|
|
name = "change_detection"
|
|
path = "examples/change_detection.rs"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[package.metadata.docs.rs]
|
|
rustdoc-args = ["-Zunstable-options", "--generate-link-to-definition"]
|
|
all-features = true
|