Skip to main content

InputQueueConfig

Struct InputQueueConfig 

Source
pub struct InputQueueConfig {
    pub queue_length: usize,
}
Expand description

Configuration for input queue sizing.

These settings control the size of the input queue (circular buffer) that stores player inputs. A larger queue allows for longer input history and higher frame delays, but uses more memory.

§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 ..InputQueueConfig::default() pattern when constructing instances.

§Memory Usage

Each input queue stores queue_length inputs per player. With 2 players and 128-frame queue (default), this is 256 input slots total.

§Constraints

  • queue_length must be at least 2 (minimum for circular buffer operation)
  • queue_length should be a power of 2 for optimal modulo performance (not enforced)
  • frame_delay must be less than queue_length (enforced at session creation)

§Example

use fortress_rollback::InputQueueConfig;

// Default configuration (128 frames = ~2.1 seconds at 60 FPS)
let default = InputQueueConfig::default();
assert_eq!(default.queue_length, 128);

// For games needing longer input history
let high_latency = InputQueueConfig::high_latency();
assert_eq!(high_latency.queue_length, 256);

// For memory-constrained environments
let minimal = InputQueueConfig::minimal();
assert_eq!(minimal.queue_length, 32);

Fields§

§queue_length: usize

The length of the input queue (circular buffer) per player.

This determines:

  • How many frames of input history are stored
  • The maximum allowed frame delay (queue_length - 1)
  • Memory usage per player

At 60 FPS:

  • 32 frames = ~0.5 seconds
  • 64 frames = ~1.1 seconds
  • 128 frames (default) = ~2.1 seconds
  • 256 frames = ~4.3 seconds

§Formal Specification Alignment

  • TLA+: QUEUE_LENGTH in specs/tla/InputQueue.tla (uses 3 for model checking)
  • Kani: INPUT_QUEUE_LENGTH in src/input_queue.rs (uses 8 for tractable verification)
  • Z3: INPUT_QUEUE_LENGTH in tests/test_z3_verification.rs (uses 128)
  • formal-spec.md: INV-4 (queue length bounds), INV-5 (index validity)
  • spec-divergences.md: Documents why different values are used

Default: 128

Implementations§

Source§

impl InputQueueConfig

Source

pub fn new() -> Self

Creates a new InputQueueConfig with default values.

Source

pub fn high_latency() -> Self

Configuration for high-latency networks.

Uses a larger queue (256 frames = ~4.3 seconds at 60 FPS) to allow for higher frame delays and longer rollback windows.

Source

pub fn minimal() -> Self

Configuration for minimal memory usage.

Uses a smaller queue (32 frames = ~0.5 seconds at 60 FPS). Suitable for games with low latency requirements.

Source

pub fn standard() -> Self

Configuration for standard networks.

Uses the default queue size (128 frames = ~2.1 seconds at 60 FPS).

Source

pub fn max_frame_delay(&self) -> usize

Returns the maximum allowed frame delay for this configuration.

This is always queue_length - 1 to ensure the circular buffer doesn’t overflow when advancing the queue head.

Source

pub fn validate_frame_delay( &self, frame_delay: usize, ) -> Result<(), FortressError>

Validates that the given frame delay is valid for this configuration.

§Errors

Returns a FortressError if frame_delay >= queue_length.

Source

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

Validates the configuration itself.

§Errors

Returns a FortressError if queue_length < 2.

Trait Implementations§

Source§

impl Clone for InputQueueConfig

Source§

fn clone(&self) -> InputQueueConfig

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for InputQueueConfig

Source§

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

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

impl Default for InputQueueConfig

Source§

fn default() -> Self

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

impl Display for InputQueueConfig

Source§

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

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

impl Hash for InputQueueConfig

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 InputQueueConfig

Source§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

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

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for InputQueueConfig

Source§

impl Eq for InputQueueConfig

Source§

impl StructuralPartialEq for InputQueueConfig

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