Struct valence_server::layer::message::Messages
source · pub struct Messages<G, L> { /* private fields */ }
Expand description
A message buffer of global messages (G
) and local messages (L
) meant for
consumption by clients. Local messages are those that have some spatial
component to them and implement the GetChunkPos
trait. Local messages
are placed in a bounding volume hierarchy for fast queries via
Self::query_local
. Global messages do not necessarily have a spatial
component and all globals will be visited when using Self::iter_global
.
Every message is associated with an arbitrary span of bytes. The meaning of the bytes is whatever the message needs it to be.
At the end of the tick and before clients have access to the buffer, all messages are sorted and then deduplicated by concatenating byte spans together. This is done for a couple of reasons:
- Messages may rely on sorted message order for correctness, like in the case of entity spawn & despawn messages. Sorting also makes deduplication easy.
- Deduplication reduces the total number of messages that all clients must examine. Consider the case of a message such as “send all clients in view of this chunk position these packet bytes”. If two of these messages have the same chunk position, then they can just be combined together.
Implementations§
source§impl<G, L> Messages<G, L>
impl<G, L> Messages<G, L>
sourcepub fn bytes(&self) -> &[u8] ⓘ
pub fn bytes(&self) -> &[u8] ⓘ
All message bytes. Use this in conjunction with Self::iter_global
and Self::query_local
.
sourcepub fn iter_global(&self) -> impl Iterator<Item = (G, Range<usize>)> + '_
pub fn iter_global(&self) -> impl Iterator<Item = (G, Range<usize>)> + '_
Returns an iterator over all global messages and their span of bytes in
Self::bytes
.
sourcepub fn query_local<F: FnMut(L, Range<usize>)>(&self, view: ChunkView, f: F)
pub fn query_local<F: FnMut(L, Range<usize>)>(&self, view: ChunkView, f: F)
Takes a visitor function f
and visits all local messages contained
within the chunk view view
. f
is called with the local
message and its span of bytes in Self::bytes
.
Trait Implementations§
Auto Trait Implementations§
impl<G, L> Freeze for Messages<G, L>
impl<G, L> RefUnwindSafe for Messages<G, L>where
G: RefUnwindSafe,
L: RefUnwindSafe,
impl<G, L> Send for Messages<G, L>
impl<G, L> Sync for Messages<G, L>
impl<G, L> Unpin for Messages<G, L>
impl<G, L> UnwindSafe for Messages<G, L>where
G: UnwindSafe,
L: UnwindSafe,
Blanket Implementations§
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
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Self
using data from the given [World
].