Skip to main content

SpectatorConfig

Struct SpectatorConfig 

Source
pub struct SpectatorConfig {
    pub buffer_size: usize,
    pub catchup_speed: usize,
    pub max_frames_behind: usize,
    pub stream_delay: usize,
    pub enable_rewind: bool,
}
Expand description

Configuration for spectator sessions.

These settings control spectator behavior including buffer sizes, catch-up speed, and frame lag tolerance.

§Forward Compatibility

New fields may be added to this struct in future versions. To ensure your code continues to compile, always use the ..Default::default() or ..SpectatorConfig::default() pattern when constructing instances.

§Example

use fortress_rollback::SpectatorConfig;

// For watching a fast-paced game, use larger buffer and faster catchup
let fast_game_config = SpectatorConfig {
    buffer_size: 90,
    catchup_speed: 2,
    max_frames_behind: 15,
    ..SpectatorConfig::default()
};

// For spectators on slower connections
let slow_connection_config = SpectatorConfig {
    buffer_size: 120,
    max_frames_behind: 20,
    ..SpectatorConfig::default()
};

// Hold playback a few frames behind the live edge to deter stream-sniping,
// and enable rewind so the spectator can seek backwards.
let broadcast_config = SpectatorConfig {
    stream_delay: 8,
    enable_rewind: true,
    ..SpectatorConfig::default()
};

Fields§

§buffer_size: usize

The number of frames of input that the spectator can buffer. This defines how many frames of inputs from the host the spectator can store before older inputs are overwritten.

A larger buffer allows the spectator to tolerate more latency or jitter, but uses more memory. Must be at least 1. Startup uses fallible allocation, so very large values return an error if the required buffers cannot be reserved.

Default: 60 (1 second at 60 FPS)

§catchup_speed: usize

How many frames to advance per step when the spectator is behind. When the spectator falls more than max_frames_behind frames behind the currently viewable edge, it will advance this many frames per step to catch up.

Higher values catch up faster but may cause visual stuttering. A value of 0 is allowed for compatibility: when catch-up mode is triggered, the spectator advances no frames and advance_frame returns Ok(<empty>).

Default: 1

§max_frames_behind: usize

The maximum number of frames the spectator can fall behind before triggering catch-up mode. When the spectator is more than this many frames behind the host’s current frame, it will use catchup_speed to advance faster.

Default: 10

§stream_delay: usize

The number of frames to hold playback back from the live edge.

When non-zero, the spectator will not advance past last_received_frame - stream_delay. This deliberately delays the spectator’s view of the match, which is useful for broadcast scenarios to deter stream-sniping (a competitor watching the stream to react to hidden information). The held-back frames are still buffered and become viewable as the host sends newer inputs.

Default: 0 (follow the live edge)

Must be less than buffer_size. A delay greater than or equal to the buffer size would make every buffered frame unviewable.

§enable_rewind: bool

Whether the spectator records game state every frame to support rewinding and seeking within the buffered window.

When true, the spectator emits a SaveGameState request before each advance and supports seek_to_frame, allowing the application to jump to any previously simulated frame still within the buffer. When false (the default), no state is saved and seek_to_frame returns a “not supported” error.

Default: false

Implementations§

Source§

impl SpectatorConfig

Source

pub fn new() -> Self

Creates a new SpectatorConfig with default values.

Source

pub fn validate(&self) -> Result<(), FortressError>

Validates this spectator configuration.

§Errors

Returns a FortressError if:

catchup_speed may be 0 to preserve the historical “no catch-up advance is attempted” behavior.

Source

pub fn fast_paced() -> Self

Configuration preset for fast-paced games.

Uses a larger buffer and faster catch-up for games where falling behind is more noticeable.

Source

pub fn slow_connection() -> Self

Configuration preset for spectators on slower connections.

Uses a larger buffer and more tolerance for falling behind.

Source

pub fn local() -> Self

Configuration preset for local viewing with minimal latency.

Uses smaller buffer and stricter catch-up for responsive viewing.

Source

pub fn broadcast() -> Self

Configuration preset for streaming/broadcast scenarios.

Optimized for live event streaming, tournament broadcasts, and replay viewers. Uses a very large buffer and conservative catch-up to avoid visual stuttering on stream.

Characteristics:

  • Large buffer (3 seconds at 60 FPS)
  • Slow, smooth catch-up to avoid jarring speed changes
  • High tolerance for falling behind
Source

pub fn mobile() -> Self

Configuration preset for mobile/cellular spectators.

Uses larger buffers and tolerant catch-up for variable mobile network conditions.

Trait Implementations§

Source§

impl Clone for SpectatorConfig

Source§

fn clone(&self) -> SpectatorConfig

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for SpectatorConfig

Source§

impl Debug for SpectatorConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SpectatorConfig

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Display for SpectatorConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for SpectatorConfig

Source§

impl Hash for SpectatorConfig

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SpectatorConfig

Source§

fn eq(&self, other: &SpectatorConfig) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for SpectatorConfig

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more