Struct bevy::ecs::query::QueryParIter
source · pub struct QueryParIter<'w, 's, D, F>where
D: QueryData,
F: QueryFilter,{ /* private fields */ }
Expand description
A parallel iterator over query results of a Query
.
This struct is created by the Query::par_iter
and
Query::par_iter_mut
methods.
Implementations§
source§impl<'w, 's, D, F> QueryParIter<'w, 's, D, F>where
D: QueryData,
F: QueryFilter,
impl<'w, 's, D, F> QueryParIter<'w, 's, D, F>where
D: QueryData,
F: QueryFilter,
sourcepub fn batching_strategy(
self,
strategy: BatchingStrategy
) -> QueryParIter<'w, 's, D, F>
pub fn batching_strategy( self, strategy: BatchingStrategy ) -> QueryParIter<'w, 's, D, F>
Changes the batching strategy used when iterating.
For more information on how this affects the resultant iteration, see
BatchingStrategy
.
Examples found in repository?
examples/ecs/parallel_query.rs (line 57)
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
fn bounce_system(windows: Query<&Window>, mut sprites: Query<(&Transform, &mut Velocity)>) {
let window = windows.single();
let width = window.width();
let height = window.height();
let left = width / -2.0;
let right = width / 2.0;
let bottom = height / -2.0;
let top = height / 2.0;
// The default batch size can also be overridden.
// In this case a batch size of 32 is chosen to limit the overhead of
// ParallelIterator, since negating a vector is very inexpensive.
sprites
.par_iter_mut()
.batching_strategy(BatchingStrategy::fixed(32))
.for_each(|(transform, mut v)| {
if !(left < transform.translation.x
&& transform.translation.x < right
&& bottom < transform.translation.y
&& transform.translation.y < top)
{
// For simplicity, just reverse the velocity; don't use realistic bounces
v.0 = -v.0;
}
});
}
sourcepub fn for_each<FN>(self, func: FN)
pub fn for_each<FN>(self, func: FN)
Runs func
on each query result in parallel.
§Panics
If the ComputeTaskPool
is not initialized. If using this from a query that is being
initialized and run from the ECS scheduler, this should never panic.
Examples found in repository?
examples/ecs/parallel_query.rs (lines 38-40)
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
fn move_system(mut sprites: Query<(&mut Transform, &Velocity)>) {
// Compute the new location of each sprite in parallel on the
// ComputeTaskPool
//
// This example is only for demonstrative purposes. Using a
// ParallelIterator for an inexpensive operation like addition on only 128
// elements will not typically be faster than just using a normal Iterator.
// See the ParallelIterator documentation for more information on when
// to use or not use ParallelIterator over a normal Iterator.
sprites
.par_iter_mut()
.for_each(|(mut transform, velocity)| {
transform.translation += velocity.extend(0.0);
});
}
// Bounce sprites outside the window
fn bounce_system(windows: Query<&Window>, mut sprites: Query<(&Transform, &mut Velocity)>) {
let window = windows.single();
let width = window.width();
let height = window.height();
let left = width / -2.0;
let right = width / 2.0;
let bottom = height / -2.0;
let top = height / 2.0;
// The default batch size can also be overridden.
// In this case a batch size of 32 is chosen to limit the overhead of
// ParallelIterator, since negating a vector is very inexpensive.
sprites
.par_iter_mut()
.batching_strategy(BatchingStrategy::fixed(32))
.for_each(|(transform, mut v)| {
if !(left < transform.translation.x
&& transform.translation.x < right
&& bottom < transform.translation.y
&& transform.translation.y < top)
{
// For simplicity, just reverse the velocity; don't use realistic bounces
v.0 = -v.0;
}
});
}
Auto Trait Implementations§
impl<'w, 's, D, F> Freeze for QueryParIter<'w, 's, D, F>where
F: WorldQuery,
D: WorldQuery,
impl<'w, 's, D, F> !RefUnwindSafe for QueryParIter<'w, 's, D, F>
impl<'w, 's, D, F> Send for QueryParIter<'w, 's, D, F>where
F: WorldQuery,
D: WorldQuery,
impl<'w, 's, D, F> Sync for QueryParIter<'w, 's, D, F>where
F: WorldQuery,
D: WorldQuery,
impl<'w, 's, D, F> Unpin for QueryParIter<'w, 's, D, F>where
F: WorldQuery,
D: WorldQuery,
impl<'w, 's, D, F> !UnwindSafe for QueryParIter<'w, 's, D, F>
Blanket Implementations§
source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
Return the
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.