From a3c3a26fc7df48d0d4c7538ea4f678db8106f47d Mon Sep 17 00:00:00 2001 From: protheeuz Date: Mon, 25 May 2026 18:06:39 +0700 Subject: [PATCH] docs: update API references, guides, and benchmark reports --- README.md | 50 +- benchmark/Benchmarks.md | 524 +++-- benchmark/default-mode-result.json | 2420 +++++++++++--------- benchmark/latency-mode-result.json | 2344 +++++++++++-------- benchmark/satset-benchmark.rbxl | Bin 0 -> 337016 bytes benchmark/src/client/init.client.luau | 70 +- benchmark/src/server/init.server.luau | 17 +- benchmark/src/shared/BenchmarkConfig.luau | 24 + benchmark/src/shared/modes/bridgenet2.luau | 2 +- benchmark/src/shared/modes/bytenet.luau | 2 +- benchmark/src/shared/modes/satset.luau | 9 +- docs/.DS_Store | Bin 0 -> 6148 bytes docs/api/channel.md | 2 +- docs/api/packet.md | 2 +- docs/api/satset.md | 9 +- docs/api/types.md | 2 +- docs/guide/architecture.md | 65 +- docs/guide/development-patterns.md | 16 +- docs/guide/getting-started.md | 4 +- docs/guide/installation.md | 2 +- docs/guide/introduction.md | 14 +- docs/guide/packets.md | 8 +- docs/guide/security.md | 14 +- 23 files changed, 3163 insertions(+), 2437 deletions(-) create mode 100644 benchmark/satset-benchmark.rbxl create mode 100644 benchmark/src/shared/BenchmarkConfig.luau create mode 100644 docs/.DS_Store diff --git a/README.md b/README.md index c831ed5..32d7308 100644 --- a/README.md +++ b/README.md @@ -11,40 +11,43 @@ -**sat·set** /sat-sèt/ *adjective (slang)* — Indonesian colloquialism for being rapid, efficient, and quick to act. +**sat·set** /sat-sèt/ *adjective (slang)*: Indonesian colloquialism for being rapid, efficient, and quick to act. -> *"Sat set, sampai."* — Indonesian for "Swiftly done." +> *"Sat set, sampai."* means "Swiftly done." -Satset is a high-performance networking library for [Roblox](https://roblox.com). It handles the heavy lifting of buffer serialization and state synchronization. It connects low-level data packing with high-level state sync, offering a unified API for both stateless events (Packets) and delta-compressed channels. +Satset is a buffer-backed networking library for [Roblox](https://roblox.com). It handles packet serialization, batching, rate limiting, and state synchronization. The public API covers stateless events (Packets) and delta-compressed state (Channels). -The library is built on the principle that code on the hot path should not allocate. By using native Luau `buffer` operations and focusing on O(1) operations, Satset maintains performance even when syncing hundreds of entities per frame. +Satset keeps the send path in Luau `buffer` objects where possible. Packet listeners receive decoded tables, and channel subscribers receive reconstructed state tables. # Performance Benchmarks -Satset is designed for high-throughput scenarios. We maintain a [benchmark suite](benchmark/Benchmarks.md) that measures Satset against native RemoteEvents and other common implementations. +The [benchmark suite](benchmark/Benchmarks.md) compares Satset with native Roblox remotes and community networking libraries. It sends 200 events per frame for 10 seconds per payload. The tables report Roblox `Stats.DataSendKbps` p50 values normalized to a 60 FPS baseline. -## Dual-Mode Batching +## Batching Profiles -Satset provides two batching strategies. Users can tune the library for engine stability (segmenting large payloads) or raw throughput. +The latest benchmark uses two Satset profiles: -| Test Case (1,000 items/frame) | Satset (Stability) | Satset (Latency) | Native Remotes | -| :--- | :--- | :--- | :--- | -| **Vectors** | 4.2 MB/s | **39.2 B/s** | 213.7 MB/s | -| **Strings** | 18.4 MB/s | **118.9 B/s** | 140.2 MB/s | -| **Booleans** | 485.4 KB/s | **38.1 B/s** | 160.9 MB/s | +| Payload | Default normalized | Latency normalized | Default commits/frame | Latency commits/frame | +| :--- | ---: | ---: | ---: | ---: | +| Vectors | 118.13 | 38.84 | 3 | 1 | +| Booleans | 10.43 | 10.38 | 1 | 1 | +| Mixed | 4.29 | 4.31 | 1 | 1 | +| Entities | 117.53 | 39.15 | 3 | 1 | +| Strings | 899.63 | 96.37 | 8 | 1 | +| SingleValue | 2.39 | 2.38 | 1 | 1 | > [!NOTE] -> **Payload Segmentation**: In standard use (Stability Mode), Satset segments payloads at 60KB to ensure frame-time consistency. Latency mode sends larger segments to allow better compression density when needed. +> `Normalized` is `Stats.DataSendKbps` adjusted to 60 FPS. The default benchmark profile uses `reliableThreshold = 60000` and `maxPacketsPerFrame = 20`. The latency profile uses `reliableThreshold = 0` and `maxPacketsPerFrame = 0`. -Detailed methodology and raw data can be found in the [Benchmarks Report](benchmark/Benchmarks.md). +Detailed methodology and raw data are in the [Benchmarks Report](benchmark/Benchmarks.md). # Documentation -Comprehensive technical documentation is available in the `docs/` directory: +Technical documentation is available in the `docs/` directory: - **[Architecture & Getting Started](docs/guide/getting-started.md)**: High-level overview and initialization. - **[API Reference](docs/api/satset.md)**: Detailed breakdown of the `Satset` namespace. -- **[Development Patterns](docs/guide/development-patterns.md)**: Design principles and performance constraints. +- **[Development Patterns](docs/guide/development-patterns.md)**: Design rules and performance constraints. - **[Security & Guard](docs/guide/security.md)**: Documentation on the token bucket rate limiting implementation. - **[Serialization Types](docs/api/types.md)**: Available data types for buffer-backed schemas. @@ -63,14 +66,15 @@ Satset provides two distinct communication modes: ## Implementation Details -- **Zero-Allocation Pipeline**: Core operations happen in pre-allocated buffers. We use a callback-based dispatch model to minimize heap allocations on the hot path. +- **Buffer-backed batching**: Outgoing payloads are encoded into Luau buffers and committed as exact-size buffers before transport. - **Nested Structs**: Use `Satset.struct(schema)` to create reusable, composable type objects for complex nested schemas. - **Readable Type Names**: Provides human-readable aliases (`string`, `uint8`, `float64`, etc.) alongside shorthand forms for cleaner, more self-documenting schemas. -- **Built-in Security**: Relies on Luau's native buffer bounds checks. Payload errors are caught via `pcall` to maintain stability without redundant manual checks. +- **Packet dispatch**: Incoming batches are decoded in place. Each packet listener receives a decoded table. +- **Built-in Security**: Relies on Luau's native buffer bounds checks. Payload errors are caught via `pcall` before they reach game code. - **Buffer Safety**: Dynamic data (strings/arrays) is capped relative to the physical buffer size to prevent memory-related issues. - **Sanitized Floats**: Floating-point types (`f32`, `f64`, `Vector3`, etc.) are clamped to 0 if they are `NaN` or `±Infinity` to prevent state corruption. - **Header Stripping**: Automatically identifies fixed-size schemas and omits size headers when possible to reduce protocol overhead. -- **MTU Management**: Automatic fragmentation for batches exceeding the [MTU](https://en.wikipedia.org/wiki/Maximum_transmission_unit) limit. +- **Batch Segmentation**: Reliable batches split at `reliableThreshold`. Unreliable batches split around the configured unreliable threshold, which defaults to 900 bytes. - **Guard**: Built-in server-side rate limiting using a token bucket algorithm to prevent spam. # Architecture @@ -111,13 +115,14 @@ flowchart TB DP --> PK DC --> CH - PK -->|"encode(schema, data)"| SR + PK -->|"calculateSize(schema, data)"| SR ST -->|"compile nested"| SC SR --> SC SR --> SN SC --> TP - PK -->|"enqueue(id, payload)"| BT + PK -->|"allocate stream slot"| BT + PK -->|"encodeInto(buffer, offset)"| SR CH -->|"encodeDelta(bitmask)"| BT BT -->|"flush & segment"| BR @@ -163,7 +168,8 @@ Satset.start({ refillRate = 30, }, batching = { - reliableThreshold = 60000, -- Segmentation for stability + reliableThreshold = 60000, -- Split reliable batches above 60 KB + maxPacketsPerFrame = 0, -- Send all ready batches each frame } }) ``` diff --git a/benchmark/Benchmarks.md b/benchmark/Benchmarks.md index 3a06648..3609222 100644 --- a/benchmark/Benchmarks.md +++ b/benchmark/Benchmarks.md @@ -1,289 +1,285 @@ # [Satset](https://github.com/bookek/satset) Networking Benchmarks -**Last Updated:** May 24, 2026 (source alignment update; raw results from May 5, 2026) +**Last updated:** May 25, 2026 -These benchmarks compare **Satset** against native Roblox remotes and popular community libraries. To ensure a fair comparison, all metrics are normalized to a 60 FPS baseline, even when a library causes the engine's framerate to drop. +These benchmarks compare Satset with native Roblox remotes and several community networking libraries. The benchmark runner fires 200 events per frame for 10 seconds. A `120K / 120K` sent/received count means 120,000 events were sent and verified by the server. -The benchmark runner fires 200 events per frame for each library. Payload descriptions below describe one event payload. A `120K / 120K` sent/received count means 120,000 events over the 10 second run. +The tables use the raw fields from `default-mode-result.json` and `latency-mode-result.json`. ---- +- `Bandwidth` is Roblox `Stats.DataSendKbps` p50. +- `Normalized` is `Stats.DataSendKbps` adjusted to a 60 FPS baseline. +- `Drain` is seconds. +- `Loss` is only `Sent` vs `Received`. A partial run can still show `0.0%` loss. -## 1. Detailed Test Results - -### 1.1 Vectors -> -> Each event contains 100 `Vector3` values. Satset encodes them as `Vector3F16`. -> Measures raw spatial data throughput. -> -> - **FPS:** Higher is better. -> - **Bandwidth:** Lower is better. -> - **Loss:** Lower is better. - -#### Vectors: Default Mode (Stability First) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 60 / 60 / 60 | 200.7 KB/s | 205.5 KB/s | 9.64ms | 120K / 120K | 0.0% | -| BridgeNet2 | 60 / 50 / 60 | 15.6 KB/s | 15.6 KB/s | 23.51ms | 108.2K / 108.2K | 0.0% | -| ByteNet | 60 / 60 / 60 | 72.8 KB/s | 72.9 KB/s | 9.45ms | 120K / 120K | 0.0% | -| Warp | 60 / 52 / 60 | 3.1 KB/s | 3.1 KB/s | 3.78ms | 114K / 114K | 0.0% | -| NetRay | 61 / 60 / 61 | 72.8 KB/s | 72.8 KB/s | 9.63ms | 120K / 120K | 0.0% | -| Zap | 60 / 60 / 60 | 73.1 KB/s | 73.1 KB/s | 9.54ms | 119.8K / 119.8K | 0.0% | -| Blink | 60 / 60 / 60 | 73.0 KB/s | 73.0 KB/s | 9.43ms | 120K / 120K | 0.0% | -| **Satset** | **60 / 45 / 60** | **118.9 KB/s** | **127.7 KB/s** | **9.39ms** | **114.2K / 114.2K** | **0.0%** | - -#### Vectors: Latency Mode (Bypass Chunking) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 60 / 60 / 60 | 145.2 KB/s | 145.2 KB/s | 9.33ms | 120K / 120K | 0.0% | -| BridgeNet2 | 60 / 60 / 61 | 15.7 KB/s | 15.7 KB/s | 22.01ms | 120K / 120K | 0.0% | -| ByteNet | 61 / 60 / 61 | 73.0 KB/s | 73.0 KB/s | 9.06ms | 120K / 120K | 0.0% | -| Warp | 60 / 57 / 60 | 2.8 KB/s | 2.8 KB/s | 3.78ms | 96.6K / 96.6K | 0.0% | -| NetRay | 61 / 60 / 61 | 72.8 KB/s | 73.0 KB/s | 8.78ms | 119.8K / 119.8K | 0.0% | -| Zap | 60 / 60 / 60 | 72.9 KB/s | 72.9 KB/s | 8.84ms | 120K / 120K | 0.0% | -| Blink | 61 / 60 / 61 | 73.0 KB/s | 73.0 KB/s | 8.79ms | 120K / 120K | 0.0% | -| **Satset** | **60 / 60 / 60** | **39.2 KB/s** | **39.2 KB/s** | **7.73ms** | **120K / 120K** | **0.0%** | - -##### Vectors Breakdown - -- **Default Mode:** Satset shows a dip in minimum FPS (45) while using 60KB segmentation. -- **Latency Mode:** With segmentation bypassed, Satset keeps a 60 FPS minimum and bandwidth drops to 39.2 KB/s as fewer Zstd dictionary resets occur. - -### 1.2 Booleans -> -> Each event contains 1,000 `boolean` values. Measures bit-packing efficiency. -> -> - **FPS:** Higher is better. -> - **Bandwidth:** Lower is better. - -#### Booleans: Default Mode (Stability First) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 48 / 44 / 48 | 65.1 KB/s | 65.1 KB/s | 10.88ms | 90K / 90K | 0.0% | -| BridgeNet2 | 49 / 31 / 49 | 24.5 KB/s | 24.5 KB/s | 23.95ms | 73.4K / 73.4K | 0.0% | -| ByteNet | 57 / 34 / 57 | 16.3 KB/s | 19.4 KB/s | 6.48ms | 89.8K / 89.8K | 0.0% | -| Warp | 60 / 60 / 60 | 2.3 KB/s | 2.3 KB/s | 3.66ms | 120K / 120K | 0.0% | -| NetRay | 60 / 60 / 60 | 10.3 KB/s | 10.3 KB/s | 6.23ms | 120K / 120K | 0.0% | -| Zap | 60 / 51 / 60 | 28.5 KB/s | 28.5 KB/s | 7.81ms | 94.6K / 94.6K | 0.0% | -| Blink | 60 / 60 / 60 | 29.4 KB/s | 29.4 KB/s | 7.46ms | 120K / 120K | 0.0% | -| **Satset** | **61 / 60 / 61** | **10.4 KB/s** | **10.4 KB/s** | **5.76ms** | **120K / 120K** | **0.0%** | - -#### Booleans: Latency Mode (Bypass Chunking) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 50 / 49 / 52 | 62.0 KB/s | 62.0 KB/s | 11.32ms | 99.4K / 99.4K | 0.0% | -| BridgeNet2 | 55 / 49 / 57 | 21.7 KB/s | 24.0 KB/s | 26.04ms | 107.8K / 107.8K | 0.0% | -| ByteNet | 60 / 60 / 60 | 19.0 KB/s | 18.9 KB/s | 6.32ms | 119.8K / 119.8K | 0.0% | -| Warp | 60 / 60 / 60 | 2.4 KB/s | 2.4 KB/s | 3.81ms | 120K / 120K | 0.0% | -| NetRay | 60 / 60 / 60 | 10.2 KB/s | 10.2 KB/s | 5.26ms | 120K / 120K | 0.0% | -| Zap | 60 / 60 / 60 | 29.3 KB/s | 29.3 KB/s | 7.26ms | 119.8K / 119.8K | 0.0% | -| Blink | 60 / 60 / 61 | 29.2 KB/s | 29.1 KB/s | 7.29ms | 120K / 120K | 0.0% | -| **Satset** | **60 / 60 / 60** | **10.4 KB/s** | **10.4 KB/s** | **5.28ms** | **120K / 120K** | **0.0%** | - -##### Booleans Breakdown - -- Satset maintains consistent 60 FPS in Latency Mode, with bit-packing efficiency outperforming Zap and Blink, while remaining tied with NetRay for bandwidth leadership. - -### 1.3 Mixed Data -> -> Each event contains one table with strings, numbers, booleans, and vectors. Measures general-purpose serialization. -> -> - **Bandwidth:** Lower is better. -> - **FPS:** Higher is better. - -#### Mixed Data: Default Mode (Stability First) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 60 / 60 / 60 | 3.9 KB/s | 3.9 KB/s | 9.63ms | 120K / 120K | 0.0% | -| BridgeNet2 | 60 / 60 / 60 | 1.6 KB/s | 1.6 KB/s | 17.53ms | 120K / 120K | 0.0% | -| ByteNet | 60 / 59 / 60 | 4.9 KB/s | 4.9 KB/s | 4.78ms | 119.8K / 119.8K | 0.0% | -| Warp | 60 / 48 / 60 | 2.4 KB/s | 2.4 KB/s | 3.94ms | 80.2K / 80.2K | 0.0% | -| NetRay | 60 / 60 / 60 | 5.0 KB/s | 5.0 KB/s | 4.74ms | 120K / 120K | 0.0% | -| Zap | 61 / 60 / 61 | 5.0 KB/s | 5.0 KB/s | 4.69ms | 120K / 120K | 0.0% | -| Blink | 61 / 54 / 61 | 4.9 KB/s | 4.9 KB/s | 4.64ms | 98.2K / 98.2K | 0.0% | -| **Satset** | **60 / 60 / 60** | **4.3 KB/s** | **4.3 KB/s** | **4.70ms** | **120K / 120K** | **0.0%** | - -#### Mixed Data: Latency Mode (Bypass Chunking) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 60 / 60 / 60 | 3.9 KB/s | 3.9 KB/s | 9.31ms | 119.8K / 119.8K | 0.0% | -| BridgeNet2 | 60 / 55 / 60 | 1.6 KB/s | 1.6 KB/s | 17.76ms | 89.8K / 89.8K | 0.0% | -| ByteNet | 60 / 60 / 60 | 4.9 KB/s | 4.9 KB/s | 4.21ms | 120K / 120K | 0.0% | -| Warp | 60 / 60 / 61 | 2.2 KB/s | 2.2 KB/s | 3.81ms | 119.8K / 119.8K | 0.0% | -| NetRay | 60 / 60 / 61 | 4.9 KB/s | 4.9 KB/s | 4.25ms | 120K / 120K | 0.0% | -| Zap | 60 / 60 / 60 | 4.9 KB/s | 4.9 KB/s | 4.28ms | 120K / 120K | 0.0% | -| Blink | 60 / 60 / 61 | 4.9 KB/s | 4.9 KB/s | 4.19ms | 120K / 120K | 0.0% | -| **Satset** | **60 / 60 / 60** | **4.3 KB/s** | **4.3 KB/s** | **4.21ms** | **120K / 120K** | **0.0%** | - -##### Mixed Data Breakdown - -- Under mixed data structures, Satset maintains 60 FPS and stays close to generated networking libraries like NetRay and Zap. - -### 1.4 Entities (High Volume) -> -> Each event contains 100 entity records, each with six `u8` fields. Measures high-frequency bulk replication. -> -> - **FPS:** Higher is better (Crucial for game feel). -> - **Bandwidth:** Lower is better. - -#### Entities: Default Mode (Stability First) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 18 / 18 / 18 | 206.8 KB/s | 206.8 KB/s | 14.76ms | 35.4K / 35.4K | 0.0% | -| BridgeNet2 | 16 / 15 / 16 | 9.7 KB/s | 38.8 KB/s | 29.18ms | 11.2K / 11.2K | 0.0% | -| ByteNet | 52 / 47 / 52 | 33.6 KB/s | 40.0 KB/s | 7.69ms | 85.2K / 85.2K | 0.0% | -| Warp | 49 / 38 / 49 | 7.5 KB/s | 10.2 KB/s | 6.34ms | 65.2K / 65.2K | 0.0% | -| NetRay | 60 / 59 / 60 | 39.0 KB/s | 39.1 KB/s | 8.31ms | 119.8K / 119.8K | 0.0% | -| Zap | 60 / 46 / 60 | 38.8 KB/s | 40.4 KB/s | 8.42ms | 111.6K / 111.6K | 0.0% | -| Blink | 60 / 60 / 60 | 39.0 KB/s | 39.0 KB/s | 8.31ms | 120K / 120K | 0.0% | -| **Satset** | **61 / 60 / 61** | **119.2 KB/s** | **119.2 KB/s** | **9.19ms** | **120K / 120K** | **0.0%** | - -> [!IMPORTANT] -> **ByteNet Performance Anomaly:** ByteNet showed a significant dip to 52 FPS under the entity workload. This indicates difficulty maintaining engine-locked framerates in this benchmark case. - -#### Entities: Latency Mode (Bypass Chunking) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 19 / 18 / 19 | 206.7 KB/s | 206.7 KB/s | 14.77ms | 34.8K / 34.8K | 0.0% | -| BridgeNet2 | 18 / 16 / 18 | 27.0 KB/s | 97.7 KB/s | 26.51ms | 27.0K / 27.0K | 0.0% | -| ByteNet | 61 / 57 / 61 | 38.9 KB/s | 39.2 KB/s | 7.78ms | 118.8K / 118.8K | 0.0% | -| Warp | 52 / 40 / 52 | 10.1 KB/s | 11.8 KB/s | 5.29ms | 87.6K / 87.6K | 0.0% | -| NetRay | 61 / 60 / 61 | 38.9 KB/s | 38.9 KB/s | 7.83ms | 120K / 120K | 0.0% | -| Zap | 60 / 60 / 60 | 39.0 KB/s | 39.0 KB/s | 7.83ms | 120K / 120K | 0.0% | -| Blink | 61 / 60 / 61 | 39.0 KB/s | 39.0 KB/s | 7.51ms | 120K / 120K | 0.0% | -| **Satset** | **60 / 60 / 60** | **39.1 KB/s** | **39.1 KB/s** | **7.80ms** | **120K / 120K** | **0.0%** | - -##### Entities Breakdown - -- Under the entity workload, Satset maintains a 61 FPS median with zero packet loss in Default Mode. - -### 1.5 Strings -> -> Each event contains 100 short strings, each 8-32 characters. Measures buffer handling and string transfer cost. -> -> - **FPS:** Higher is better. -> - **Bandwidth:** Lower is better. - -#### Strings: Default Mode (Stability First) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 60 / 55 / 60 | 156.6 KB/s | 156.6 KB/s | 12.34ms | 118.6K / 118.6K | 0.0% | -| BridgeNet2 | 60 / 60 / 60 | 27.4 KB/s | 27.4 KB/s | 24.13ms | 119.8K / 119.8K | 0.0% | -| ByteNet | 0 / 0 / 0 | 0.0 KB/s | 0.0 KB/s | 3.54ms | 1.4K / 1.4K | 100% | -| Warp | 61 / 60 / 61 | 16.6 KB/s | 16.6 KB/s | 6.38ms | 120K / 120K | 0.0% | -| NetRay | 60 / 60 / 60 | 96.7 KB/s | 96.7 KB/s | 10.29ms | 120K / 120K | 0.0% | -| Zap | 60 / 52 / 60 | 100.4 KB/s | 100.4 KB/s | 10.15ms | 88.6K / 88.6K | 0.0% | -| Blink | 60 / 53 / 60 | 100.2 KB/s | 100.2 KB/s | 11.79ms | 98.8K / 98.8K | 0.0% | -| **Satset** | **60 / 57 / 60** | **948.9 KB/s** | **948.9 KB/s** | **10.31ms** | **117.2K / 117.2K** | **0.0%** | - -> [!IMPORTANT] -> **ByteNet Failure Analysis:** In the Strings benchmark, ByteNet failed after processing approximately 1,400 packets. This resulted in 0 recorded FPS/Bandwidth metrics for that run. - -#### Strings: Latency Mode (Bypass Chunking) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 61 / 53 / 61 | 82.0 KB/s | 85.2 KB/s | 10.94ms | 112.2K / 112.2K | 0.0% | -| BridgeNet2 | 60 / 55 / 60 | 27.2 KB/s | 27.3 KB/s | 24.26ms | 106.2K / 106.2K | 0.0% | -| ByteNet | 0 / 0 / 0 | 0.0 B/s | 0.0 B/s | 3.01ms | 1.6K / 1.6K | 100% | -| Warp | 60 / 60 / 60 | 5.5 KB/s | 5.5 KB/s | 3.76ms | 120K / 120K | 0.0% | -| NetRay | 60 / 60 / 60 | 96.8 KB/s | 96.8 KB/s | 10.83ms | 120K / 120K | 0.0% | -| Zap | 60 / 60 / 60 | 100.7 KB/s | 100.7 KB/s | 9.86ms | 120K / 120K | 0.0% | -| Blink | 60 / 60 / 60 | 100.3 KB/s | 100.4 KB/s | 9.86ms | 120K / 120K | 0.0% | -| **Satset** | **60 / 60 / 60** | **96.5 KB/s** | **96.5 KB/s** | **9.88ms** | **120K / 120K** | **0.0%** | - -##### Strings Breakdown - -- **Latency Mode:** Satset is close to NetRay and Zap in string throughput when segmentation is disabled. This indicates that segmentation and compression reset behavior are major parts of the Default Mode bandwidth result. -- **ByteNet Reliability:** ByteNet failed again in Latency Mode, stopping after 1,600 packets in this run. - -### 1.6 SingleValue -> -> Sending a single primitive value (`u8`) per packet. Measures the baseline overhead of the library's batching system. -> -> - **Bandwidth:** Lower is better. -> - **FPS:** Higher is better. - -#### SingleValue: Default Mode (Stability First) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 60 / 60 / 60 | 227.2 KB/s | 227.2 KB/s | 10.79ms | 120K / 120K | 0.0% | -| BridgeNet2 | 60 / 60 / 60 | 141.8 KB/s | 141.8 KB/s | 11.51ms | 120K / 120K | 0.0% | -| ByteNet | 61 / 60 / 61 | 2.2 KB/s | 2.2 KB/s | 3.68ms | 120K / 120K | 0.0% | -| Warp | 60 / 60 / 60 | 2.3 KB/s | 2.3 KB/s | 3.76ms | 120K / 120K | 0.0% | -| NetRay | 61 / 60 / 61 | 2.4 KB/s | 2.3 KB/s | 3.73ms | 120K / 120K | 0.0% | -| Zap | 61 / 60 / 61 | 2.3 KB/s | 2.3 KB/s | 3.73ms | 120K / 120K | 0.0% | -| Blink | 60 / 60 / 60 | 2.4 KB/s | 2.4 KB/s | 3.71ms | 120K / 120K | 0.0% | -| **Satset** | **61 / 55 / 61** | **2.4 KB/s** | **2.4 KB/s** | **4.03ms** | **103K / 103K** | **0.0%** | - -#### SingleValue: Latency Mode (Bypass Chunking) - -| Library | FPS (p50/min/p95) | Bandwidth (p50) | Norm. BW (p50) | Drain Duration | Sent / Recv | Loss % | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Roblox | 61 / 60 / 61 | 230.0 KB/s | 230.0 KB/s | 8.38ms | 120K / 120K | 0.0% | -| BridgeNet2 | 60 / 55 / 60 | 142.4 KB/s | 142.4 KB/s | 10.68ms | 98.8K / 98.8K | 0.0% | -| ByteNet | 61 / 60 / 61 | 2.3 KB/s | 2.3 KB/s | 3.73ms | 120K / 120K | 0.0% | -| Warp | 60 / 60 / 60 | 2.4 KB/s | 2.4 KB/s | 4.01ms | 119.8K / 119.8K | 0.0% | -| NetRay | 60 / 60 / 60 | 2.4 KB/s | 2.4 KB/s | 3.73ms | 120K / 120K | 0.0% | -| Zap | 60 / 60 / 60 | 2.3 KB/s | 2.3 KB/s | 3.69ms | 120K / 120K | 0.0% | -| Blink | 61 / 60 / 61 | 2.4 KB/s | 2.4 KB/s | 3.81ms | 120K / 120K | 0.0% | -| **Satset** | **61 / 60 / 61** | **2.4 KB/s** | **2.4 KB/s** | **3.74ms** | **120K / 120K** | **0.0%** | - -##### SingleValue Breakdown - -- In single-value tests, Satset demonstrates minimal batching overhead, performing almost identically to pure code-gen libraries despite its internal stateful synchronization features. +Treat rows with low frame counts or partial packet counts as incomplete rows, not winners. ByteNet in the Strings test is the clearest example: it reports `0.00` bandwidth because the run stops early, not because it sends data for free. --- -## 2. Technical Analysis +## Result Summary + +Satset is clean in all default and latency rows. The current default profile still fragments large reliable payloads. That shows up as 3 reliable commits per frame for Vectors and Entities, and 8 reliable commits per frame for Strings. The latency profile uses one reliable commit per frame and cuts those bandwidth numbers sharply. + +Current Satset default rows: -### The "Compression Illusion" +| Payload | Frames | Sent / Received | Min FPS | Commits / frame | Normalized | +| :--- | ---: | :--- | ---: | ---: | ---: | +| Vectors | 601 | 120.2K / 120.2K | 60 | 3 | 118.13 | +| Booleans | 601 | 120.2K / 120.2K | 60 | 1 | 10.43 | +| Mixed | 601 | 120.2K / 120.2K | 60 | 1 | 4.29 | +| Entities | 601 | 120.2K / 120.2K | 60 | 3 | 117.53 | +| Strings | 601 | 120.2K / 120.2K | 60 | 8 | 899.63 | +| SingleValue | 601 | 120.2K / 120.2K | 60 | 1 | 2.39 | -Roblox uses [Zstd](https://facebook.github.io/zstd/) compression on network traffic. Sending repeated data in fewer buffers can produce lower reported bandwidth because compression has more context. +Current Satset latency rows: -- **Example:** In the **Vectors** benchmark, Satset's normalized bandwidth dropped from **127.7 KB/s** (Default) to **39.2 KB/s** (Latency) when segmentation was bypassed. This shows that segmentation and compression reset behavior affect reported bandwidth. +| Payload | Frames | Sent / Received | Min FPS | Commits / frame | Normalized | +| :--- | ---: | :--- | ---: | ---: | ---: | +| Vectors | 600 | 120K / 120K | 60 | 1 | 38.84 | +| Booleans | 601 | 120.2K / 120.2K | 60 | 1 | 10.38 | +| Mixed | 600 | 120K / 120K | 60 | 1 | 4.31 | +| Entities | 601 | 120.2K / 120.2K | 60 | 1 | 39.15 | +| Strings | 600 | 120K / 120K | 60 | 1 | 96.37 | +| SingleValue | 601 | 120.2K / 120.2K | 60 | 1 | 2.38 | -### GC Pressure and Frame Drops +Opinionated read: -The `Entities` test highlights the impact of allocation and batching behavior. Libraries that create many remote calls or intermediate tables per frame can show lower minimum framerates. Satset's batcher keeps this case at 60 FPS in Default Mode. +- Satset's serializer is not the source of the default-mode gap. Raw bytes per packet are almost identical between default and latency. +- Commit count is the main signal. Vectors and Entities use 3 commits per frame in default mode. Strings uses 8. +- The next useful profile is a named throughput profile that keeps one reliable commit per frame without changing default behavior. +- Repeated-id segmentation should be tested separately. It can reduce benchmark bytes in homogeneous rows, but it does not explain the large default-mode gap by itself. + +--- -### Throttling Philosophy +## Payloads -Satset can spread network load across multiple frames, visible in the higher Drain Duration. This can add a small amount of latency while reducing frame-time spikes. +| Payload | Contents | +| :--- | :--- | +| Vectors | 100 `Vector3` values. Satset uses `Vector3F16`. | +| Booleans | 1,000 boolean values. | +| Mixed | One table with integers, booleans, vectors, and a short string. | +| Entities | 100 records, each with six `u8` fields. | +| Strings | 100 short strings, each 8 to 32 characters. | +| SingleValue | One `u8` value. | --- -## 3. Methodology - -- **Environment:** Local Roblox Studio (1 Player). -- **Test Intensity:** 200 events per frame (approx. 12,000 per second) for 10 seconds. -- **Payload Source:** `benchmark/src/shared/benches`. -- **Satset Mode Source:** `benchmark/src/shared/BenchmarkConfig.luau`. -- **Metrics:** - - **FPS p50/min/p95:** Median, absolute minimum, and 95th percentile framerate (**Higher is better**). - - **Bandwidth p50:** Median raw bytes per second sent over the network (**Lower is better**). - - **Normalized Bandwidth:** Bandwidth adjusted to a 60 FPS baseline (**Lower is better**). - - **Drain Duration:** Time (ms) for the internal data queue to empty (**Lower is better for latency**). - - **Sent / Received:** Total packets fired vs. packets successfully verified on the server (**Higher is better**). - - **Loss %:** Percentage of packets that were dropped or failed verification (**Lower is better**). -- **Validation:** Every packet is verified for data integrity using epsilon-based comparisons. +## Vectors + +### Default Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 60 | 179145.70 | 179145.71 | 9.65 | 120K / 120K | 0.0% | +| BridgeNet2 | 60 / 60 / 60 | 15641.98 | 15641.98 | 22.55 | 120K / 120K | 0.0% | +| ByteNet | 60 / 59 / 60 | 72.48 | 72.48 | 9.43 | 119.8K / 119.8K | 0.0% | +| Warp | 60 / 54 / 60 | 2.89 | 2.93 | 5.02 | 107.2K / 107.2K | 0.0% | +| NetRay | 60 / 60 / 61 | 72.54 | 72.49 | 9.87 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 61 | 72.77 | 72.76 | 9.40 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 60 | 72.72 | 72.72 | 9.45 | 120K / 120K | 0.0% | +| Packet | 60 / 60 / 61 | 72.47 | 72.43 | 9.52 | 120.2K / 120.2K | 0.0% | +| Satset | 60 / 60 / 60 | 118.13 | 118.13 | 8.88 | 120.2K / 120.2K | 0.0% | + +### Latency Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 61 | 174809.52 | 174809.52 | 9.87 | 120K / 120K | 0.0% | +| BridgeNet2 | 60 / 59 / 60 | 15613.31 | 15613.31 | 22.55 | 119.8K / 119.8K | 0.0% | +| ByteNet | 60 / 60 / 61 | 72.59 | 72.56 | 10.32 | 120K / 120K | 0.0% | +| Warp | 60 / 54 / 61 | 6.71 | 6.71 | 5.15 | 107.8K / 107.8K | 0.0% | +| NetRay | 60 / 52 / 61 | 71.83 | 71.83 | 9.88 | 108.6K / 108.6K | 0.0% | +| Zap | 60 / 60 / 60 | 72.78 | 72.78 | 9.53 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 61 | 72.62 | 72.62 | 9.50 | 120.2K / 120.2K | 0.0% | +| Packet | 60 / 60 / 60 | 72.85 | 72.85 | 10.08 | 120K / 120K | 0.0% | +| Satset | 60 / 60 / 61 | 38.84 | 38.84 | 8.22 | 120K / 120K | 0.0% | + +Satset wins this row in latency mode. Default mode still pays for three reliable commits per frame. + +## Booleans + +### Default Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 48 / 43 / 51 | 52079.03 | 63487.25 | 10.86 | 93.6K / 93.6K | 0.0% | +| BridgeNet2 | 54 / 52 / 56 | 21597.02 | 24020.96 | 23.38 | 92.8K / 92.8K | 0.0% | +| ByteNet | 60 / 60 / 60 | 19.04 | 19.04 | 6.75 | 120K / 120K | 0.0% | +| Warp | 60 / 60 / 60 | 2.53 | 2.53 | 3.75 | 120K / 120K | 0.0% | +| NetRay | 60 / 60 / 60 | 10.27 | 10.27 | 5.73 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 60 | 29.35 | 29.35 | 7.80 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 61 | 29.38 | 29.38 | 7.48 | 120K / 120K | 0.0% | +| Packet | 57 / 48 / 61 | 25.30 | 26.89 | 6.58 | 93.2K / 93.2K | 0.0% | +| Satset | 60 / 60 / 61 | 10.43 | 10.43 | 5.47 | 120.2K / 120.2K | 0.0% | + +### Latency Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 47 / 46 / 48 | 54850.50 | 71744.48 | 10.88 | 93.2K / 93.2K | 0.0% | +| BridgeNet2 | 52 / 50 / 52 | 20440.36 | 23969.86 | 23.73 | 102.2K / 102.2K | 0.0% | +| ByteNet | 60 / 60 / 61 | 19.18 | 19.18 | 6.57 | 120K / 120K | 0.0% | +| Warp | 60 / 60 / 60 | 2.51 | 2.51 | 3.83 | 120K / 120K | 0.0% | +| NetRay | 60 / 60 / 60 | 10.41 | 10.41 | 5.52 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 60 | 29.42 | 29.42 | 7.57 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 61 | 29.40 | 29.40 | 7.48 | 120.2K / 120.2K | 0.0% | +| Packet | 58 / 57 / 60 | 26.10 | 27.07 | 7.36 | 115.8K / 115.8K | 0.0% | +| Satset | 60 / 60 / 61 | 10.39 | 10.38 | 5.73 | 120.2K / 120.2K | 0.0% | + +Warp is the bandwidth leader. Satset and NetRay sit close together and both stay at full frame rate. + +## Mixed + +### Default Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 60 | 3645.96 | 3645.96 | 9.32 | 120K / 120K | 0.0% | +| BridgeNet2 | 60 / 60 / 60 | 1674.85 | 1674.85 | 17.47 | 120K / 120K | 0.0% | +| ByteNet | 61 / 60 / 61 | 4.86 | 4.86 | 4.73 | 120K / 120K | 0.0% | +| Warp | 60 / 60 / 60 | 2.37 | 2.37 | 3.80 | 120K / 120K | 0.0% | +| NetRay | 60 / 56 / 61 | 4.97 | 4.99 | 4.45 | 104.6K / 104.6K | 0.0% | +| Zap | 60 / 60 / 60 | 5.06 | 5.06 | 4.53 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 60 | 5.02 | 5.02 | 4.38 | 120K / 120K | 0.0% | +| Packet | 60 / 60 / 60 | 4.79 | 4.79 | 4.38 | 120.2K / 120.2K | 0.0% | +| Satset | 60 / 60 / 61 | 4.28 | 4.29 | 4.11 | 120.2K / 120.2K | 0.0% | + +### Latency Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 60 | 3558.99 | 3558.99 | 9.38 | 120K / 120K | 0.0% | +| BridgeNet2 | 60 / 60 / 61 | 1680.33 | 1680.33 | 16.98 | 120K / 120K | 0.0% | +| ByteNet | 60 / 60 / 61 | 4.86 | 4.86 | 4.65 | 120K / 120K | 0.0% | +| Warp | 60 / 60 / 60 | 2.29 | 2.29 | 3.61 | 120K / 120K | 0.0% | +| NetRay | 60 / 60 / 61 | 4.99 | 4.99 | 4.38 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 60 | 4.97 | 4.97 | 4.58 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 60 | 5.01 | 5.01 | 4.72 | 120.2K / 120.2K | 0.0% | +| Packet | 60 / 60 / 60 | 4.70 | 4.70 | 4.37 | 120K / 120K | 0.0% | +| Satset | 60 / 60 / 60 | 4.31 | 4.31 | 4.22 | 120K / 120K | 0.0% | + +Satset is not the lowest bandwidth row, but it is close to Packet, ByteNet, NetRay, Zap, and Blink while staying at full frame rate. + +## Entities + +### Default Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 19 / 18 / 20 | 200387.59 | 658854.21 | 14.23 | 36K / 36K | 0.0% | +| BridgeNet2 | 17 / 16 / 20 | 21929.40 | 81590.27 | 27.51 | 26.8K / 26.8K | 0.0% | +| ByteNet | 60 / 60 / 61 | 39.03 | 38.88 | 8.28 | 119.8K / 119.8K | 0.0% | +| Warp | 53 / 50 / 55 | 11.20 | 12.73 | 5.86 | 104.8K / 104.8K | 0.0% | +| NetRay | 60 / 59 / 61 | 38.92 | 38.85 | 8.33 | 119.8K / 119.8K | 0.0% | +| Zap | 60 / 60 / 61 | 38.92 | 38.87 | 8.28 | 119.8K / 119.8K | 0.0% | +| Blink | 60 / 49 / 60 | 36.03 | 36.03 | 8.45 | 80.8K / 80.8K | 0.0% | +| Packet | 50 / 49 / 52 | 31.26 | 38.21 | 8.38 | 99.4K / 99.4K | 0.0% | +| Satset | 60 / 60 / 60 | 117.53 | 117.53 | 9.24 | 120.2K / 120.2K | 0.0% | + +### Latency Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 18 / 17 / 19 | 197299.86 | 690549.54 | 14.27 | 34.2K / 34.2K | 0.0% | +| BridgeNet2 | 18 / 17 / 19 | 28973.95 | 98591.93 | 27.85 | 30.2K / 30.2K | 0.0% | +| ByteNet | 60 / 60 / 61 | 39.04 | 39.04 | 8.35 | 119.8K / 119.8K | 0.0% | +| Warp | 52 / 48 / 53 | 9.99 | 12.04 | 7.01 | 100.2K / 100.2K | 0.0% | +| NetRay | 60 / 60 / 60 | 38.97 | 38.97 | 8.32 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 60 | 38.97 | 38.97 | 8.40 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 61 | 38.98 | 38.98 | 8.26 | 120.2K / 120.2K | 0.0% | +| Packet | 52 / 50 / 52 | 30.12 | 35.43 | 8.34 | 102K / 102K | 0.0% | +| Satset | 60 / 60 / 60 | 39.15 | 39.15 | 8.32 | 120.2K / 120.2K | 0.0% | + +Default mode is the weak Satset row here. Latency mode brings Satset close to NetRay, Zap, Blink, and ByteNet. + +## Strings + +### Default Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 61 | 158676.12 | 158214.25 | 11.42 | 119.8K / 119.8K | 0.0% | +| BridgeNet2 | 60 / 59 / 61 | 27369.92 | 27383.28 | 24.10 | 120K / 120K | 0.0% | +| ByteNet | 0 / 0 / 0 | 0.00 | 0.00 | 4.55 | 1.6K / 1.6K | 0.0% | +| Warp | 60 / 57 / 61 | 3.34 | 3.35 | 4.32 | 117.4K / 117.4K | 0.0% | +| NetRay | 60 / 57 / 60 | 96.02 | 96.02 | 10.35 | 91.6K / 91.6K | 0.0% | +| Zap | 60 / 60 / 60 | 101.23 | 101.23 | 10.35 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 61 | 99.90 | 99.86 | 10.35 | 119.8K / 119.8K | 0.0% | +| Packet | 60 / 58 / 60 | 95.74 | 95.76 | 10.35 | 119.8K / 119.8K | 0.0% | +| Satset | 60 / 60 / 60 | 899.63 | 899.63 | 10.30 | 120.2K / 120.2K | 0.0% | + +### Latency Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 61 | 62755.32 | 62755.32 | 13.05 | 120K / 120K | 0.0% | +| BridgeNet2 | 60 / 60 / 60 | 27457.38 | 27457.39 | 25.23 | 120K / 120K | 0.0% | +| ByteNet | 0 / 0 / 0 | 0.00 | 0.00 | 4.54 | 1.6K / 1.6K | 0.0% | +| Warp | 60 / 60 / 60 | 4.44 | 4.44 | 4.32 | 120K / 120K | 0.0% | +| NetRay | 60 / 60 / 61 | 96.40 | 96.31 | 11.95 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 61 | 100.43 | 100.30 | 10.32 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 60 | 100.05 | 100.05 | 12.30 | 120.2K / 120.2K | 0.0% | +| Packet | 60 / 60 / 61 | 95.99 | 95.99 | 10.43 | 120K / 120K | 0.0% | +| Satset | 60 / 60 / 60 | 96.37 | 96.37 | 10.33 | 120K / 120K | 0.0% | + +Strings expose the default segmentation cost most clearly. Satset falls from 899.63 to 96.37 normalized when the run uses one reliable commit per frame. + +## SingleValue + +### Default Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 55 / 60 | 231.53 | 231.96 | 9.27 | 118.6K / 118.6K | 0.0% | +| BridgeNet2 | 60 / 60 / 60 | 145.09 | 145.09 | 11.35 | 120K / 120K | 0.0% | +| ByteNet | 60 / 60 / 60 | 2.31 | 2.31 | 3.72 | 120K / 120K | 0.0% | +| Warp | 60 / 60 / 61 | 1.80 | 1.80 | 3.78 | 120K / 120K | 0.0% | +| NetRay | 60 / 58 / 60 | 2.39 | 2.39 | 3.75 | 119.6K / 119.6K | 0.0% | +| Zap | 60 / 54 / 61 | 2.39 | 2.38 | 3.80 | 118.4K / 118.4K | 0.0% | +| Blink | 61 / 60 / 61 | 2.33 | 2.33 | 3.70 | 120K / 120K | 0.0% | +| Packet | 60 / 60 / 60 | 2.29 | 2.29 | 3.73 | 120.2K / 120.2K | 0.0% | +| Satset | 60 / 60 / 60 | 2.39 | 2.39 | 3.65 | 120.2K / 120.2K | 0.0% | + +### Latency Mode + +| Library | FPS p50 / min / p95 | Bandwidth | Normalized | Drain | Sent / Received | Loss | +| :--- | :--- | ---: | ---: | ---: | :--- | ---: | +| Roblox | 60 / 60 / 61 | 233.73 | 233.73 | 10.32 | 120K / 120K | 0.0% | +| BridgeNet2 | 60 / 60 / 60 | 144.82 | 144.82 | 11.43 | 120K / 120K | 0.0% | +| ByteNet | 60 / 60 / 60 | 2.36 | 2.36 | 3.75 | 120K / 120K | 0.0% | +| Warp | 60 / 60 / 61 | 2.24 | 2.24 | 3.80 | 120K / 120K | 0.0% | +| NetRay | 60 / 60 / 60 | 2.38 | 2.38 | 3.73 | 120K / 120K | 0.0% | +| Zap | 60 / 60 / 60 | 2.38 | 2.38 | 3.73 | 120K / 120K | 0.0% | +| Blink | 60 / 60 / 60 | 2.39 | 2.39 | 3.68 | 120.2K / 120.2K | 0.0% | +| Packet | 60 / 60 / 60 | 2.31 | 2.31 | 3.75 | 120K / 120K | 0.0% | +| Satset | 60 / 60 / 61 | 2.38 | 2.38 | 3.70 | 120.2K / 120.2K | 0.0% | + +SingleValue is measurement-noise territory for the compact libraries. Warp, Packet, ByteNet, NetRay, Zap, Blink, and Satset are all close. --- -## 4. Raw Data Access +## Methodology + +- Environment: local Roblox Studio, 1 player. +- Test load: 200 events per frame for 10 seconds per library per payload. +- Payload source: `benchmark/src/shared/benches`. +- Satset profile source: `benchmark/src/shared/BenchmarkConfig.luau`. +- Default profile: `reliableThreshold = 60000`, `maxPacketsPerFrame = 20`. +- Latency profile: `reliableThreshold = 0`, `maxPacketsPerFrame = 0`. +- Validation: the server verifies every received packet. + +The benchmark does not prove a single universal winner. It shows how each library behaves under one heavy local Studio workload. Use the packet counts and min FPS before comparing bandwidth. + +## Raw Data + +- [default-mode-result.json](./default-mode-result.json) +- [latency-mode-result.json](./latency-mode-result.json) -For developers wishing to perform their own analysis or verify these claims, the complete, unedited performance logs are available in JSON format: +## Running In Roblox Studio -- **Stability First (Default):** [default-mode-result.json](./default-mode-result.json) -- **Latency Bypassed:** [latency-mode-result.json](./latency-mode-result.json) +The benchmark place file is [satset-benchmark.rbxl](./satset-benchmark.rbxl). -To regenerate the latency-mode result, set `activeMode = "latency"` in `benchmark/src/shared/BenchmarkConfig.luau` before running the benchmark. +1. Open `benchmark/satset-benchmark.rbxl` in Roblox Studio. +2. If you are testing local source changes, connect Rojo to this repo before pressing Play. +3. Set `activeMode` in `benchmark/src/shared/BenchmarkConfig.luau` to `"default"` or `"latency"`. +4. Press Play with one local player and wait until Studio Output prints `Generated results`. +5. The server creates `game.Result`, a `StringValue` whose `Value` contains the JSON for the run. Use that value for `default-mode-result.json` or `latency-mode-result.json`, based on the selected mode. diff --git a/benchmark/default-mode-result.json b/benchmark/default-mode-result.json index 7ffff3f..055e2f3 100644 --- a/benchmark/default-mode-result.json +++ b/benchmark/default-mode-result.json @@ -3,180 +3,186 @@ "warp": { "Framerate": [ 60, - 52, + 54, 60, - 61, - 61, - 61 + 60, + 60, + 60 ], "Bandwidth": [ - 3.088067054748535, - 2.6653831005096437, - 6.292206287384033, - 9.309511184692383, - 9.309511184692383, - 9.309511184692383 - ], - "DrainDuration": 3.7841443450015506, - "Sent": 114000, - "Recieve": 114000, + 2.890460968017578, + 1.7929075956344605, + 3.004763603210449, + 3.5621888637542726, + 3.5621888637542726, + 3.5621888637542726 + ], + "DrainDuration": 5.017596043006051, + "Recieve": 107200, + "Sent": 107200, + "Frames": 536, "NormalizedBandwidth": [ - 3.1382349002274094, - 2.665383239520205, - 6.86422541156543, - 9.309511670221227, - 9.309511670221227, - 9.309511670221227 + 2.9304551222412646, + 1.7929076891418783, + 3.338626403021652, + 3.622565141869823, + 3.622565141869823, + 3.622565141869823 ] }, "bridgenet2": { "Framerate": [ 60, - 50, + 60, 60, 60, 60, 60 ], "Bandwidth": [ - 15635.525390625, - 6571.4423828125, - 15684.734375, - 15690.7099609375, - 15690.7099609375, - 15690.7099609375 - ], - "DrainDuration": 23.515351253001428, - "Sent": 108200, - "Recieve": 108200, + 15641.9755859375, + 11947.02734375, + 15718.9580078125, + 15720.7001953125, + 15815.02734375, + 15815.02734375 + ], + "DrainDuration": 22.54958272499789, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 15635.526206081195, - 7918.588495291852, - 15684.735193022643, - 15690.710779271794, - 15690.710779271794, - 15690.710779271794 + 15641.976401730099, + 11947.02796683603, + 15718.958827620045, + 15720.701015210907, + 15815.028168567951, + 15815.028168567951 ] }, - "packet": { + "netray_compile": { "Framerate": [ 60, 60, - 60, + 61, 61, 61, 61 ], "Bandwidth": [ - 72.11532592773438, - 55.13937759399414, - 72.76392364501953, - 72.87982940673828, - 72.87982940673828, - 72.87982940673828 - ], - "DrainDuration": 9.949517610999465, - "Sent": 120000, + 72.53569793701172, + 54.78264236450195, + 72.73424530029297, + 73.13679504394531, + 73.13679504394531, + 73.13679504394531 + ], + "DrainDuration": 9.866517457994633, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 72.29811908592973, - 55.13937861993202, - 72.76392576307994, - 72.87983152636222, - 72.87983152636222, - 72.87983152636222 + 72.4884757654317, + 55.010906217886077, + 72.64267346634483, + 73.13679885832642, + 73.13679885832642, + 73.13679885832642 ] }, - "roblox": { + "bytenet": { "Framerate": [ 60, - 60, + 59, 60, 60, 60, 60 ], "Bandwidth": [ - 205561.421875, - 178082.953125, - 205574.609375, - 205586.203125, - 205586.203125, - 205586.203125 - ], - "DrainDuration": 9.648211512998387, - "Sent": 120000, - "Recieve": 120000, + 72.48241424560547, + 54.673179626464847, + 72.79023742675781, + 72.7933578491211, + 73.21208190917969, + 73.21208190917969 + ], + "DrainDuration": 9.43261930499284, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 205561.42531393527, - 178082.95610738677, - 205574.61281146313, - 205586.2065593845, - 205586.2065593845, - 205586.2065593845 + 72.48241802585796, + 54.67318247789336, + 72.79336164559055, + 73.2120857274873, + 73.77156780983313, + 73.77156780983313 ] }, - "satset": { + "roblox": { "Framerate": [ 60, - 45, + 60, 60, 60, 60, 60 ], "Bandwidth": [ - 118.91763305664062, - 118.91763305664062, - 118.91763305664062, - 118.91763305664062, - 118.91763305664062, - 118.91763305664062 - ], - "DrainDuration": 9.395111124999312, - "Sent": 114200, - "Recieve": 114200, + 179145.703125, + 60405.6171875, + 186123.46875, + 187852.375, + 198002.53125, + 198002.53125 + ], + "DrainDuration": 9.65049344500585, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 127.7345388047936, - 127.73454316954203, - 127.73454316954203, - 127.73454316954203, - 127.73454316954203, - 127.73454316954203 + 179145.7124681765, + 60405.620337898436, + 186123.47845709534, + 187852.38479726483, + 198002.54157663673, + 198002.54157663673 ] }, - "bytenet": { + "blink": { "Framerate": [ 60, 60, 60, - 61, - 61, - 61 + 60, + 60, + 60 ], "Bandwidth": [ - 72.71212768554688, - 52.32768249511719, - 72.93282318115234, - 72.9463119506836, - 72.9463119506836, - 72.9463119506836 - ], - "DrainDuration": 9.458212111000466, - "Sent": 120000, + 72.71742248535156, + 55.3709831237793, + 72.8493881225586, + 72.85452270507813, + 72.90422821044922, + 72.90422821044922 + ], + "DrainDuration": 9.449541082998622, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 72.8122393856112, - 52.32768346764585, - 72.93282531238947, - 72.94631408192074, - 72.94631408192074, - 72.94631408192074 + 72.71742627786068, + 55.370986011601107, + 72.84939192195026, + 72.85452650473758, + 72.90423201270102, + 72.90423201270102 ] }, - "netray": { + "zap": { "Framerate": [ - 61, + 60, 60, 61, 61, @@ -184,55 +190,90 @@ 61 ], "Bandwidth": [ - 72.76811218261719, - 55.13937759399414, - 72.8276138305664, - 72.87982940673828, - 72.87982940673828, - 72.87982940673828 - ], - "DrainDuration": 9.638211512999013, - "Sent": 120000, + 72.76981353759766, + 55.466033935546878, + 73.06119537353516, + 73.22405242919922, + 73.22405242919922, + 73.22405242919922 + ], + "DrainDuration": 9.39830150900525, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 72.8142385458312, - 55.13937861993202, - 72.8276159628868, - 72.87983152636222, - 72.87983152636222, - 72.87983152636222 + 72.76176807324086, + 55.697145289282278, + 73.1241939195844, + 73.22405624813115, + 73.22405624813115, + 73.22405624813115 ] }, - "zap": { + "packet": { "Framerate": [ 60, 60, - 60, - 60, - 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 73.08212280273438, - 55.27622985839844, - 73.11192321777344, - 73.11192321777344, - 73.11192321777344, - 73.11192321777344 - ], - "DrainDuration": 9.548212112997135, - "Sent": 119800, - "Recieve": 119800, + 72.4673080444336, + 57.30524444580078, + 72.7082748413086, + 72.80976104736328, + 72.80976104736328, + 72.80976104736328 + ], + "DrainDuration": 9.515919608005789, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 73.08212403213007, - 55.27623078817734, - 73.1119244473851, - 73.1119244473851, - 73.1119244473851, - 73.1119244473851 + 72.43305584066633, + 57.30524743450218, + 72.80976484468823, + 72.9157867292972, + 72.9157867292972, + 72.9157867292972 ] }, - "blink": { + "satset": { + "DrainDuration": 8.884687450001366, + "DebugStats": { + "reliableCommitBytes": 72724606, + "commitGcKb": 234, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 1803, + "reliableCommits": 1803, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 8523, + "sendGcKb": 3, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 118.12657781605424, + 114.50610948758367, + 118.94550180895976, + 118.9924607347487, + 119.38084271301222, + 119.38084271301222 + ], "Framerate": [ 60, 60, @@ -242,24 +283,36 @@ 60 ], "Bandwidth": [ - 72.95561218261719, - 55.27622985839844, - 72.98111724853516, - 73.11192321777344, - 73.11192321777344, - 73.11192321777344 - ], - "DrainDuration": 9.438212112996553, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 72.95561340989091, - 55.27623078817734, - 72.98111847647248, - 73.1119244473851, - 73.1119244473851, - 73.1119244473851 - ] + 118.12657165527344, + 114.506103515625, + 118.94549560546875, + 118.9924545288086, + 119.3808364868164, + 119.3808364868164 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 201463, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -7680, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 122003, + "receiveDecodeGcKb": 2 + }, + "Recieve": 120200 } }, "Booleans": { @@ -273,115 +326,149 @@ 60 ], "Bandwidth": [ - 2.261234044265747, - 1.898376226425171, - 2.274221181869507, - 2.2882111072540283, - 2.2882111072540283, - 2.2882111072540283 - ], - "DrainDuration": 3.664112124001258, - "Sent": 120000, + 2.5280051231384279, + 2.41890287399292, + 2.5903611183166506, + 2.6852736473083498, + 4.595119476318359, + 4.595119476318359 + ], + "DrainDuration": 3.7509580519981684, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.2612340823055977, - 1.8983762583597402, - 2.274221220131495, - 2.2882111457474474, - 2.2882111457474474, - 2.2882111457474474 + 2.528005254984169, + 2.4189030001485358, + 2.5903612534145106, + 2.6852737873562839, + 4.5951197159725158, + 4.5951197159725158 ] }, "bridgenet2": { "Framerate": [ - 49, - 31, - 49, - 49, - 49, - 49 + 54, + 52, + 55, + 56, + 56, + 56 ], "Bandwidth": [ - 19515.61328125, - 7813.1123046875, - 19515.61328125, - 19515.61328125, - 19515.61328125, - 19515.61328125 - ], - "DrainDuration": 23.951335112002133, - "Sent": 73400, - "Recieve": 73400, + 21597.015625, + 15018.9638671875, + 21933.330078125, + 22058.376953125, + 22058.376953125, + 22058.376953125 + ], + "DrainDuration": 23.37892199799535, + "Recieve": 92800, + "Sent": 92800, + "Frames": 464, "NormalizedBandwidth": [ - 25048.455246604215, - 10019.375253683884, - 25048.455246604215, - 25048.455246604215, - 25048.455246604215, - 25048.455246604215 + 24020.960932802256, + 17401.78102035091, + 24139.794061205463, + 24240.76741273898, + 24240.76741273898, + 24240.76741273898 ] }, - "packet": { + "netray_compile": { "Framerate": [ - 48, - 45, - 48, - 48, - 48, - 48 + 60, + 60, + 60, + 60, + 60, + 60 + ], + "Bandwidth": [ + 10.267995834350586, + 7.645515441894531, + 10.327715873718262, + 10.333728790283204, + 10.337851524353028, + 10.337851524353028 + ], + "DrainDuration": 5.733045668006525, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, + "NormalizedBandwidth": [ + 10.2679963698683, + 7.645515840639234, + 10.327716412350619, + 10.333729329229158, + 10.337852063514, + 10.337852063514 + ] + }, + "bytenet": { + "Framerate": [ + 60, + 60, + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 53381.515625, - 31145.32421875, - 53381.515625, - 53381.515625, - 53381.515625, - 53381.515625 - ], - "DrainDuration": 10.884112110998103, - "Sent": 90000, - "Recieve": 90000, + 19.038877487182618, + 14.346100807189942, + 19.122026443481447, + 19.126558303833009, + 19.186111450195314, + 19.186111450195314 + ], + "DrainDuration": 6.749614586995449, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 66649.3732890472, - 38885.34023770337, - 66649.3732890472, - 66649.3732890472, - 66649.3732890472, - 66649.3732890472 + 19.038878480137457, + 14.346101555397404, + 19.122027458581614, + 19.126559390425734, + 19.186112486565919, + 19.186112486565919 ] }, "roblox": { "Framerate": [ 48, - 44, - 48, - 48, - 48, - 48 + 43, + 49, + 51, + 51, + 51 ], "Bandwidth": [ - 53381.515625, - 31145.32421875, - 53381.515625, - 53381.515625, - 53381.515625, - 53381.515625 - ], - "DrainDuration": 10.884112110998103, - "Sent": 90000, - "Recieve": 90000, + 52079.02734375, + 42960.4296875, + 54077.0625, + 56808.8671875, + 56808.8671875, + 56808.8671875 + ], + "DrainDuration": 10.855842433011276, + "Recieve": 93600, + "Sent": 93600, + "Frames": 468, "NormalizedBandwidth": [ - 66649.3732890472, - 42470.89886363636, - 66649.3732890472, - 66649.3732890472, - 66649.3732890472, - 66649.3732890472 + 63487.24735938568, + 53924.29198465775, + 73126.31130630178, + 73879.55508312948, + 73879.55508312948, + 73879.55508312948 ] }, - "satset": { + "blink": { "Framerate": [ - 61, + 60, 60, 61, 61, @@ -389,55 +476,27 @@ 61 ], "Bandwidth": [ - 10.376221656799316, - 8.653422355651855, - 10.384211540222168, - 10.384211540222168, - 10.384211540222168, - 10.384211540222168 - ], - "DrainDuration": 5.764112124001258, - "Sent": 120000, + 29.376415252685548, + 22.09522819519043, + 29.51577377319336, + 29.67349624633789, + 29.67349624633789, + 29.67349624633789 + ], + "DrainDuration": 7.484228474000702, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 10.376221831146704, - 8.653422501061803, - 10.384211714774648, - 10.384211714774648, - 10.384211714774648, - 10.384211714774648 - ] - }, - "bytenet": { - "Framerate": [ - 57, - 34, - 57, - 57, - 57, - 57 - ], - "Bandwidth": [ - 16.26411247253418, - 9.758411407470703, - 16.273411750793457, - 16.273411750793457, - 16.273411750793457, - 16.273411750793457 - ], - "DrainDuration": 6.484112124001258, - "Sent": 89800, - "Recieve": 89800, - "NormalizedBandwidth": [ - 19.418858739958342, - 17.220726715456223, - 19.429961605333553, - 19.429961605333553, - 19.429961605333553, - 19.429961605333553 + 29.376416784784995, + 22.09522934754638, + 29.51577531256092, + 29.67349779393132, + 29.67349779393132, + 29.67349779393132 ] }, - "netray": { + "zap": { "Framerate": [ 60, 60, @@ -447,112 +506,160 @@ 60 ], "Bandwidth": [ - 10.264211654663086, - 8.653422355651855, - 10.274211883544922, - 10.274211883544922, - 10.274211883544922, - 10.274211883544922 - ], - "DrainDuration": 6.234112124001258, - "Sent": 120000, + 29.3526554107666, + 21.838335037231447, + 29.515899658203126, + 29.562232971191408, + 29.655065536499025, + 29.655065536499025 + ], + "DrainDuration": 7.80146282298665, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 10.264211827050307, - 8.653422501061803, - 10.274212056002778, - 10.274212056002778, - 10.274212056002778, - 10.274212056002778 + 29.352656941626877, + 21.838336176189374, + 29.51590119757725, + 29.562234512982003, + 29.655067083131216, + 29.655067083131216 ] }, - "zap": { + "packet": { "Framerate": [ + 57, + 48, 60, - 51, - 60, - 60, - 60, - 60 + 61, + 61, + 61 ], "Bandwidth": [ - 28.52222442626953, - 18.653422355651855, - 28.52222442626953, - 28.52222442626953, - 28.52222442626953, - 28.52222442626953 - ], - "DrainDuration": 7.814112124001258, - "Sent": 94600, - "Recieve": 94600, + 25.295551300048829, + 14.827459335327149, + 26.949735641479493, + 27.766550064086915, + 27.766550064086915, + 27.766550064086915 + ], + "DrainDuration": 6.576663271000143, + "Recieve": 93200, + "Sent": 93200, + "Frames": 466, "NormalizedBandwidth": [ - 28.52222490130639, - 21.945203300890635, - 28.52222490130639, - 28.52222490130639, - 28.52222490130639, - 28.52222490130639 + 26.89403543481396, + 18.766004243150346, + 27.453480371245488, + 27.88034919787034, + 27.88034919787034, + 27.88034919787034 ] }, - "blink": { + "satset": { + "DrainDuration": 5.46710864501074, + "DebugStats": { + "reliableCommitBytes": 15627202, + "commitGcKb": 26, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 601, + "reliableCommits": 601, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 9386, + "sendGcKb": 2, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 10.427624292622255, + 8.05251960441066, + 10.48030444912483, + 10.487274716875846, + 10.487274716875846, + 10.487274716875846 + ], "Framerate": [ 60, 60, - 60, - 60, - 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 29.355115356445312, - 18.653422355651855, - 29.355115356445312, - 29.355115356445312, - 29.355115356445312, - 29.355115356445312 - ], - "DrainDuration": 7.464112124001258, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 29.355115845422892, - 18.653422501061803, - 29.355115845422892, - 29.355115845422892, - 29.355115845422892, - 29.355115845422892 - ] + 10.427623748779297, + 8.085657119750977, + 10.474220275878907, + 10.487274169921875, + 10.487274169921875, + 10.487274169921875 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 828976, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -740810, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120801, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 } }, "Mixed": { "warp": { "Framerate": [ 60, - 48, + 60, 60, 60, 60, 60 ], "Bandwidth": [ - 2.3551111221313477, - 1.8211111111111111, - 2.4111211332702637, - 2.4111211332702637, - 2.4111211332702637, - 2.4111211332702637 - ], - "DrainDuration": 3.944111212999464, - "Sent": 80200, - "Recieve": 80200, + 2.367743730545044, + 2.001237630844116, + 2.4215505123138429, + 2.4323205947875978, + 2.5007174015045168, + 2.5007174015045168 + ], + "DrainDuration": 3.7973680819995936, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.355111161427509, - 2.2763889154032014, - 2.4111211734994273, - 2.4111211734994273, - 2.4111211734994273, - 2.4111211734994273 + 2.3677438540325026, + 2.001237735216792, + 2.4215506386075438, + 2.432320721643002, + 2.5007175319270926, + 2.5007175319270926 ] }, "bridgenet2": { @@ -565,52 +672,84 @@ 60 ], "Bandwidth": [ - 1635.43310546875, - 1355.211111111111, - 1648.111111111111, - 1648.111111111111, - 1648.111111111111, - 1648.111111111111 - ], - "DrainDuration": 17.531211112998412, - "Sent": 120000, + 1674.851806640625, + 1321.96240234375, + 1680.8363037109376, + 1685.98828125, + 1688.636962890625, + 1688.636962890625 + ], + "DrainDuration": 17.466414558002727, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 1635.4331327318532, - 1355.2111336952873, - 1648.1111385848202, - 1648.1111385848202, - 1648.1111385848202, - 1648.1111385848202 + 1674.8518939909537, + 1321.962471289462, + 1680.836391373382, + 1685.988369181141, + 1688.6370509599056, + 1688.6370509599056 ] }, - "packet": { + "netray_compile": { "Framerate": [ 60, + 56, 60, + 61, + 61, + 61 + ], + "Bandwidth": [ + 4.971836090087891, + 3.9490153789520265, + 5.230027198791504, + 5.288918972015381, + 5.288918972015381, + 5.288918972015381 + ], + "DrainDuration": 4.449728205989231, + "Recieve": 104600, + "Sent": 104600, + "Frames": 523, + "NormalizedBandwidth": [ + 4.99255233186328, + 4.026360952269961, + 5.251819250254751, + 5.288919247854, + 5.288919247854, + 5.288919247854 + ] + }, + "bytenet": { + "Framerate": [ + 61, 60, - 60, - 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 72.12211608886719, - 54.12222222222222, - 72.76666666666667, - 72.76666666666667, - 72.76666666666667, - 72.76666666666667 - ], - "DrainDuration": 9.614112110999121, - "Sent": 120000, + 4.8627705574035648, + 3.7894835472106935, + 4.907449722290039, + 4.907667636871338, + 4.907667636871338, + 4.907667636871338 + ], + "DrainDuration": 4.734052910003811, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 72.12211729119614, - 54.12222312440366, - 72.76666787948293, - 72.76666787948293, - 72.76666787948293, - 72.76666787948293 + 4.862770811016812, + 3.7894837448476617, + 4.907449978233487, + 4.907667892826151, + 4.907667892826151, + 4.907667892826151 ] }, "roblox": { @@ -623,26 +762,27 @@ 60 ], "Bandwidth": [ - 3948.111328125, - 2355.111111111111, - 3948.111328125, - 3948.111328125, - 3948.111328125, - 3948.111328125 - ], - "DrainDuration": 9.638211112999464, - "Sent": 120000, + 3645.95849609375, + 3551.18408203125, + 3707.31884765625, + 3745.72607421875, + 3793.969970703125, + 3793.969970703125 + ], + "DrainDuration": 9.315273878994049, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 3948.1113939396263, - 2355.111150371587, - 3948.1113939396263, - 3948.1113939396263, - 3948.1113939396263, - 3948.1113939396263 + 3645.9586862453036, + 3551.1842672399327, + 3707.319041007995, + 3745.726269573588, + 3793.9701685740785, + 3793.9701685740785 ] }, - "satset": { + "blink": { "Framerate": [ 60, 60, @@ -652,55 +792,57 @@ 60 ], "Bandwidth": [ - 4.266666889190674, - 3.211111111111111, - 4.311111111111111, - 4.311111111111111, - 4.311111111111111, - 4.311111111111111 - ], - "DrainDuration": 4.704112110998514, - "Sent": 120000, + 5.01809549331665, + 3.8224503993988039, + 5.083568096160889, + 5.11272668838501, + 5.136458396911621, + 5.136458396911621 + ], + "DrainDuration": 4.382963971002027, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 4.266666960317855, - 3.2111111646394303, - 4.31111118301138, - 4.31111118301138, - 4.31111118301138, - 4.31111118301138 + 5.018095755030725, + 3.822450598755127, + 5.083568361289625, + 5.112726955034486, + 5.136458664798802, + 5.136458664798802 ] }, - "bytenet": { + "zap": { "Framerate": [ 60, - 59, + 60, 60, 60, 60, 60 ], "Bandwidth": [ - 4.855555534362793, - 3.311111111111111, - 4.911111111111111, - 4.911111111111111, - 4.911111111111111, - 4.911111111111111 - ], - "DrainDuration": 4.784112111002353, - "Sent": 119800, - "Recieve": 119800, + 5.063509941101074, + 3.9991307258605959, + 5.120892524719238, + 5.168327808380127, + 5.198076248168945, + 5.198076248168945 + ], + "DrainDuration": 4.533552018008777, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 4.855555615307399, - 3.36723170427188, - 4.911111192972963, - 4.911111192972963, - 4.911111192972963, - 4.911111192972963 + 5.063510205183697, + 3.9991309344315164, + 5.120892791794596, + 5.168328077929427, + 5.198076519269748, + 5.198076519269748 ] }, - "netray": { + "packet": { "Framerate": [ 60, 60, @@ -710,204 +852,195 @@ 60 ], "Bandwidth": [ - 4.955555438995361, - 3.411111111111111, - 5.011111111111111, - 5.011111111111111, - 5.011111111111111, - 5.011111111111111 - ], - "DrainDuration": 4.744112112999464, - "Sent": 120000, - "Recieve": 120000, + 4.789048671722412, + 3.8322553634643556, + 4.831278324127197, + 4.832939624786377, + 4.894881725311279, + 4.894881725311279 + ], + "DrainDuration": 4.382298404001631, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 4.955555521606554, - 3.4111111679720336, - 5.01111119462704, - 5.01111119462704, - 5.01111119462704, - 5.01111119462704 + 4.789048921490764, + 3.8322555633320478, + 4.831278576097997, + 4.83293987684382, + 4.894881980599255, + 4.894881980599255 ] }, - "zap": { - "Framerate": [ - 61, - 60, - 61, - 61, - 61, - 61 - ], - "Bandwidth": [ - 4.955555438995361, - 3.411111111111111, - 5.011111111111111, - 5.011111111111111, - 5.011111111111111, - 5.011111111111111 - ], - "DrainDuration": 4.694112111002353, - "Sent": 120000, - "Recieve": 120000, + "satset": { + "DrainDuration": 4.114856778003741, + "DebugStats": { + "reliableCommitBytes": 3847602, + "commitGcKb": 6, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 601, + "reliableCommits": 601, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 0, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 4.955555521606554, - 3.4111111679720336, - 5.01111119462704, - 5.01111119462704, - 5.01111119462704, - 5.01111119462704 - ] - }, - "blink": { + 4.28698275989948, + 3.5555240578105087, + 4.321188675227159, + 4.422958127861509, + 4.476990933261327, + 4.476990933261327 + ], "Framerate": [ - 61, - 54, - 61, - 61, + 60, + 60, + 60, + 60, 61, 61 ], "Bandwidth": [ - 4.855555534362793, - 3.311111111111111, - 4.911111111111111, - 4.911111111111111, - 4.911111111111111, - 4.911111111111111 - ], - "DrainDuration": 4.644112110999121, - "Sent": 98200, - "Recieve": 98200, - "NormalizedBandwidth": [ - 4.855555615307399, - 3.6790123761763784, - 4.911111192972963, - 4.911111192972963, - 4.911111192972963, - 4.911111192972963 - ] + 4.276167392730713, + 3.5555238723754885, + 4.321188449859619, + 4.422957897186279, + 4.476990699768066, + 4.476990699768066 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 34093, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -876, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120801, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 } }, "Entities": { "warp": { "Framerate": [ - 49, - 38, - 49, - 49, - 49, - 49 + 53, + 50, + 55, + 55, + 55, + 55 ], "Bandwidth": [ - 7.511111259460449, - 4.211111111111111, - 7.511111111111111, - 7.511111111111111, - 7.511111111111111, - 7.511111111111111 - ], - "DrainDuration": 6.344112112999464, - "Sent": 65200, - "Recieve": 65200, + 11.196282386779786, + 7.589590549468994, + 11.764313697814942, + 11.93932056427002, + 11.93932056427002, + 11.93932056427002 + ], + "DrainDuration": 5.864050429008785, + "Recieve": 104800, + "Sent": 104800, + "Frames": 524, "NormalizedBandwidth": [ - 10.219165275829671, - 6.649122858485743, - 10.219165073144167, - 10.219165073144167, - 10.219165073144167, - 10.219165073144167 + 12.72785005758546, + 9.221353053669024, + 13.350331957596519, + 13.389117109362792, + 13.389117109362792, + 13.389117109362792 ] }, "bridgenet2": { "Framerate": [ + 17, 16, - 15, - 16, - 16, - 16, - 16 + 19, + 20, + 20, + 20 ], "Bandwidth": [ - 9715.43359375, - 6355.211111111111, - 9748.111111111111, - 9748.111111111111, - 9748.111111111111, - 9748.111111111111 - ], - "DrainDuration": 29.181211112998412, - "Sent": 11200, - "Recieve": 11200, + 21929.3984375, + 14871.76171875, + 27527.98828125, + 29490.4296875, + 29490.4296875, + 29490.4296875 + ], + "DrainDuration": 27.5115366109967, + "Recieve": 26800, + "Sent": 26800, + "Frames": 134, "NormalizedBandwidth": [ - 38861.73523412351, - 25420.84473852085, - 38992.44523312351, - 38992.44523312351, - 38992.44523312351, - 38992.44523312351 + 81590.26562036792, + 45916.56730386879, + 92400.67540511597, + 107553.33585984344, + 107553.33585984344, + 107553.33585984344 ] }, - "packet": { + "netray_compile": { "Framerate": [ - 18, - 18, - 18, - 18, - 18, - 18 - ], - "Bandwidth": [ - 211712.115625, - 154122.22222222222, - 211766.66666666667, - 211766.66666666667, - 211766.66666666667, - 211766.66666666667 - ], - "DrainDuration": 14.764112110999121, - "Sent": 35400, - "Recieve": 35400, - "NormalizedBandwidth": [ - 717621.1856214532, - 513740.7513414073, - 717805.8656214532, - 717805.8656214532, - 717805.8656214532, - 717805.8656214532 - ] - }, - "roblox": { - "Framerate": [ - 18, - 18, - 18, - 18, - 18, - 18 + 60, + 59, + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 211712.115625, - 154122.22222222222, - 211766.66666666667, - 211766.66666666667, - 211766.66666666667, - 211766.66666666667 - ], - "DrainDuration": 14.764112110999121, - "Sent": 35400, - "Recieve": 35400, + 38.92438888549805, + 28.630207061767579, + 39.00762939453125, + 39.03105926513672, + 39.03105926513672, + 39.03105926513672 + ], + "DrainDuration": 8.334220327000367, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 717621.1856214532, - 513740.7513414073, - 717805.8656214532, - 717805.8656214532, - 717805.8656214532, - 717805.8656214532 + 38.84776410488235, + 28.63020860827715, + 39.03106130076509, + 39.14743247525482, + 39.14743247525482, + 39.14743247525482 ] }, - "satset": { + "bytenet": { "Framerate": [ - 61, + 60, 60, 61, 61, @@ -915,113 +1048,180 @@ 61 ], "Bandwidth": [ - 119.22211608886719, - 84.12222222222222, - 119.26666666666667, - 119.26666666666667, - 119.26666666666667, - 119.26666666666667 - ], - "DrainDuration": 9.194112110999121, - "Sent": 120000, - "Recieve": 120000, + 39.03129577636719, + 28.422805786132814, + 39.16684341430664, + 39.24283218383789, + 39.24283218383789, + 39.24283218383789 + ], + "DrainDuration": 8.278367886989145, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 119.22211804364446, - 84.12222362035987, - 119.26666862534591, - 119.26666862534591, - 119.26666862534591, - 119.26666862534591 + 38.88097623292613, + 28.422807850855265, + 39.16684633246388, + 39.24283488837032, + 39.24283488837032, + 39.24283488837032 ] }, - "bytenet": { + "roblox": { "Framerate": [ - 52, - 47, - 52, - 52, - 52, - 52 + 19, + 18, + 19, + 20, + 20, + 20 ], "Bandwidth": [ - 33.61212768554688, - 22.32768249511719, - 33.93282318115234, - 33.9463119506836, - 33.9463119506836, - 33.9463119506836 - ], - "DrainDuration": 7.698212111000466, - "Sent": 85200, - "Recieve": 85200, + 200387.59375, + 169907.078125, + 216616.25, + 217491.9375, + 217491.9375, + 217491.9375 + ], + "DrainDuration": 14.227369316999102, + "Recieve": 36000, + "Sent": 36000, + "Frames": 180, "NormalizedBandwidth": [ - 39.9872413856112, - 31.06642131445657, - 40.01224531238947, - 40.04631408192074, - 40.04631408192074, - 40.04631408192074 + 658854.2108462813, + 554433.6622652277, + 731014.6159614716, + 743114.1216436246, + 743114.1216436246, + 743114.1216436246 ] }, - "netray": { + "blink": { "Framerate": [ 60, - 59, + 49, 60, 60, 60, 60 ], "Bandwidth": [ - 38.86811218261719, - 25.13937759399414, - 39.0276138305664, - 39.07982940673828, - 39.07982940673828, - 39.07982940673828 - ], - "DrainDuration": 8.318211512999013, - "Sent": 119800, - "Recieve": 119800, + 36.03293228149414, + 11.830374717712403, + 38.78770065307617, + 38.87779998779297, + 38.87779998779297, + 38.87779998779297 + ], + "DrainDuration": 8.450334709996242, + "Recieve": 80800, + "Sent": 80800, + "Frames": 404, "NormalizedBandwidth": [ - 39.0142385458312, - 25.565469502366914, - 39.0276159628868, - 39.07983152636222, - 39.07983152636222, - 39.07983152636222 + 36.032934160758, + 14.486173852259676, + 38.7877026760124, + 38.877802015428247, + 38.877802015428247, + 38.877802015428247 ] }, "zap": { "Framerate": [ - 60, - 46, - 60, 60, 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 38.68212280273438, - 25.27622985839844, - 38.81192321777344, - 38.81192321777344, - 38.81192321777344, - 38.81192321777344 - ], - "DrainDuration": 8.428212112997135, - "Sent": 111600, - "Recieve": 111600, + 38.920501708984378, + 28.92695426940918, + 38.9479866027832, + 38.94910430908203, + 38.94910430908203, + 38.94910430908203 + ], + "DrainDuration": 8.28381725399231, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 38.78212403213007, - 40.40422204780517, - 38.8119244473851, - 38.8119244473851, - 38.8119244473851, - 38.8119244473851 + 38.87452519030617, + 28.926955939709364, + 38.94910634043612, + 39.09136793022222, + 39.09136793022222, + 39.09136793022222 ] }, - "blink": { + "packet": { + "Framerate": [ + 50, + 49, + 51, + 52, + 52, + 52 + ], + "Bandwidth": [ + 31.260360717773439, + 21.640050888061525, + 32.47395324707031, + 33.11435317993164, + 33.11435317993164, + 33.11435317993164 + ], + "DrainDuration": 8.382789288007189, + "Recieve": 99400, + "Sent": 99400, + "Frames": 497, + "NormalizedBandwidth": [ + 38.2088710109303, + 25.458884749214115, + 38.91596125487791, + 39.131115721712578, + 39.131115721712578, + 39.131115721712578 + ] + }, + "satset": { + "DrainDuration": 9.23560994998843, + "DebugStats": { + "reliableCommitBytes": 72724606, + "commitGcKb": 2, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 1803, + "reliableCommits": 1803, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 7543, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 117.52604525299575, + 113.38900585266203, + 118.25751349182838, + 118.65625629891292, + 119.3990540787081, + 119.3990540787081 + ], "Framerate": [ 60, 60, @@ -1031,144 +1231,100 @@ 60 ], "Bandwidth": [ - 38.95561218261719, - 25.27622985839844, - 38.98111724853516, - 39.01192321777344, - 39.01192321777344, - 39.01192321777344 - ], - "DrainDuration": 8.318212112996553, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 38.95561340989091, - 25.27623078817734, - 38.98111847647248, - 39.0119244473851, - 39.0119244473851, - 39.0119244473851 - ] + 117.52603912353516, + 113.38899993896485, + 118.25750732421875, + 118.65625, + 119.3990478515625, + 119.3990478515625 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 37284, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -3342, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 122003, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 } }, "Strings": { "warp": { "Framerate": [ - 61, 60, - 61, + 57, + 60, 61, 61, 61 ], "Bandwidth": [ - 16.611111221313477, - 10.211111111111111, - 16.611121133270263, - 16.611121133270263, - 16.611121133270263, - 16.611121133270263 - ], - "DrainDuration": 6.384111212999464, - "Sent": 120000, - "Recieve": 120000, + 3.339949369430542, + 2.410991907119751, + 4.599241256713867, + 4.635377883911133, + 4.635377883911133, + 4.635377883911133 + ], + "DrainDuration": 4.316263066997635, + "Recieve": 117400, + "Sent": 117400, + "Frames": 587, "NormalizedBandwidth": [ - 16.61111161427509, - 10.211111111111111, - 16.611121173499427, - 16.611121173499427, - 16.611121173499427, - 16.611121173499427 + 3.345189030590072, + 2.559035405665311, + 4.84130684301723, + 4.879345404525255, + 4.879345404525255, + 4.879345404525255 ] }, "bridgenet2": { "Framerate": [ 60, - 60, - 60, - 60, - 60, - 60 - ], - "Bandwidth": [ - 27435.43310546875, - 18355.21111111111, - 27448.11111111111, - 27448.11111111111, - 27448.11111111111, - 27448.11111111111 - ], - "DrainDuration": 24.131211112998412, - "Sent": 119800, - "Recieve": 119800, - "NormalizedBandwidth": [ - 27435.433132731853, - 18355.211133695287, - 27448.11113858482, - 27448.11113858482, - 27448.11113858482, - 27448.11113858482 - ] - }, - "packet": { - "Framerate": [ - 60, - 55, - 60, - 60, - 60, - 60 - ], - "Bandwidth": [ - 160351.515625, - 123145.32421875, - 160351.515625, - 160351.515625, - 160351.515625, - 160351.515625 - ], - "DrainDuration": 12.344112110998103, - "Sent": 118600, - "Recieve": 118600, - "NormalizedBandwidth": [ - 160351.515625, - 142345.32421875, - 160351.515625, - 160351.515625, - 160351.515625, - 160351.515625 - ] - }, - "roblox": { - "Framerate": [ - 60, - 55, - 60, - 60, - 60, - 60 + 59, + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 160351.515625, - 123145.32421875, - 160351.515625, - 160351.515625, - 160351.515625, - 160351.515625 - ], - "DrainDuration": 12.344112110998103, - "Sent": 118600, - "Recieve": 118600, + 27369.91796875, + 21649.95703125, + 27724.568359375, + 27839.669921875, + 27839.669921875, + 27839.669921875 + ], + "DrainDuration": 24.09962713799905, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 160351.515625, - 142345.32421875, - 160351.515625, - 160351.515625, - 160351.515625, - 160351.515625 + 27383.283318518294, + 21561.228833576643, + 27610.94453193514, + 27690.14639641275, + 27690.14639641275, + 27690.14639641275 ] }, - "satset": { + "netray_compile": { "Framerate": [ 60, 57, @@ -1178,23 +1334,24 @@ 60 ], "Bandwidth": [ - 948.9176330566406, - 948.9176330566406, - 948.9176330566406, - 948.9176330566406, - 948.9176330566406, - 948.9176330566406 - ], - "DrainDuration": 10.315111124999312, - "Sent": 117200, - "Recieve": 117200, + 96.01789855957031, + 72.67913818359375, + 96.50682830810547, + 96.6336898803711, + 96.6336898803711, + 96.6336898803711 + ], + "DrainDuration": 10.349840333990869, + "Recieve": 91600, + "Sent": 91600, + "Frames": 458, "NormalizedBandwidth": [ - 948.9176330566406, - 998.9176330566406, - 948.9176330566406, - 948.9176330566406, - 948.9176330566406, - 948.9176330566406 + 96.01790356729396, + 72.67914197410619, + 96.50683334132879, + 101.71967886337974, + 101.71967886337974, + 101.71967886337974 ] }, "bytenet": { @@ -1214,9 +1371,10 @@ 0, 0 ], - "DrainDuration": 3.5402112290030347, - "Sent": 1400, - "Recieve": 1400, + "DrainDuration": 4.554712537996238, + "Recieve": 1600, + "Sent": 1600, + "Frames": 8, "NormalizedBandwidth": [ 0, 0, @@ -1226,96 +1384,160 @@ 0 ] }, - "netray": { + "roblox": { "Framerate": [ 60, 60, + 61, + 61, + 61, + 61 + ], + "Bandwidth": [ + 158676.125, + 62701.5625, + 185281.1875, + 189184.796875, + 189184.796875, + 189184.796875 + ], + "DrainDuration": 11.418339181996999, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, + "NormalizedBandwidth": [ + 158214.249038932, + 62701.5658275794, + 185281.19750828006, + 189973.0770341348, + 189973.0770341348, + 189973.0770341348 + ] + }, + "blink": { + "Framerate": [ 60, 60, - 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 96.71212768554688, - 52.32768249511719, - 96.93282318115234, - 96.9463119506836, - 96.9463119506836, - 96.9463119506836 - ], - "DrainDuration": 10.298212111000466, - "Sent": 120000, - "Recieve": 120000, + 99.90201568603516, + 70.48593139648438, + 100.270751953125, + 100.72390747070313, + 100.72390747070313, + 100.72390747070313 + ], + "DrainDuration": 10.348186507995706, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 96.8122393856112, - 52.32768346764585, - 96.93282531238947, - 96.94631408192074, - 96.94631408192074, - 96.94631408192074 + 99.8598115024206, + 71.36700929384239, + 100.33517218108904, + 100.5040093556488, + 100.5040093556488, + 100.5040093556488 ] }, "zap": { "Framerate": [ 60, - 52, + 60, 60, 60, 60, 60 ], "Bandwidth": [ - 100.41212768554688, - 82.32768249511719, - 100.43282318115234, - 100.4463119506836, - 100.4463119506836, - 100.4463119506836 - ], - "DrainDuration": 10.158212111000466, - "Sent": 88600, - "Recieve": 88600, + 101.22911071777344, + 76.48998260498047, + 101.49319458007813, + 101.49600219726563, + 101.52214050292969, + 101.52214050292969 + ], + "DrainDuration": 10.35065956399194, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 100.4122393856112, - 94.32768346764585, - 100.43282531238947, - 100.44631408192074, - 100.44631408192074, - 100.44631408192074 + 101.22911599728298, + 76.48998659424393, + 101.49319987336071, + 101.49600749069464, + 101.52214579772192, + 101.52214579772192 ] }, - "blink": { + "packet": { "Framerate": [ 60, - 53, + 58, 60, 60, 60, 60 ], "Bandwidth": [ - 100.21212768554688, - 82.32768249511719, - 100.23282318115234, - 100.2463119506836, - 100.2463119506836, - 100.2463119506836 - ], - "DrainDuration": 11.798212111000466, - "Sent": 98800, - "Recieve": 98800, + 95.73635864257813, + 73.33147430419922, + 95.94190979003906, + 96.01290893554688, + 96.23210906982422, + 96.23210906982422 + ], + "DrainDuration": 10.348626498001977, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 100.2122393856112, - 113.32768346764585, - 100.23282531238947, - 100.24631408192074, - 100.24631408192074, - 100.24631408192074 + 95.75932811435507, + 73.33147812873364, + 96.01291394301029, + 96.23211408871981, + 96.87157463597005, + 96.87157463597005 ] - } - }, - "SingleValue": { - "warp": { + }, + "satset": { + "DrainDuration": 10.300590774000739, + "DebugStats": { + "reliableCommitBytes": 260723416, + "commitGcKb": 824, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 4808, + "reliableCommits": 4808, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 9132, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 899.6280376419122, + 849.0741409623524, + 907.7277084744992, + 922.8502068217927, + 958.1896251687931, + 958.1896251687931 + ], "Framerate": [ 60, 60, @@ -1325,23 +1547,67 @@ 60 ], "Bandwidth": [ - 2.261234044265747, - 1.898376226425171, - 2.274221181869507, - 2.2882111072540283, - 2.2882111072540283, - 2.2882111072540283 - ], - "DrainDuration": 3.764112124001258, - "Sent": 120000, + 899.6279907226563, + 849.0740966796875, + 907.7276611328125, + 922.8501586914063, + 958.1895751953125, + 958.1895751953125 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 104335, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": 2, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 125008, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 + } + }, + "SingleValue": { + "warp": { + "Framerate": [ + 60, + 60, + 61, + 61, + 61, + 61 + ], + "Bandwidth": [ + 1.801207184791565, + 1.2526928186416627, + 1.969154953956604, + 1.9788663387298585, + 1.9788663387298585, + 1.9788663387298585 + ], + "DrainDuration": 3.783751056995243, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.2612340823055977, - 1.8983762583597402, - 2.274221220131495, - 2.2882111457474474, - 2.2882111457474474, - 2.2882111457474474 + 1.80120727873184, + 1.2526928839746843, + 1.9691550566560379, + 1.9788664419357805, + 1.9788664419357805, + 1.9788664419357805 ] }, "bridgenet2": { @@ -1354,55 +1620,57 @@ 60 ], "Bandwidth": [ - 145.261234044265747, - 112.898376226425171, - 145.274221181869507, - 145.2882111072540283, - 145.2882111072540283, - 145.2882111072540283 - ], - "DrainDuration": 11.514112124001258, - "Sent": 120000, + 145.08642578125, + 114.35136413574219, + 145.39695739746095, + 145.45826721191407, + 145.72694396972657, + 145.72694396972657 + ], + "DrainDuration": 11.348725957999705, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 145.2612340823055977, - 112.8983762583597402, - 145.274221220131495, - 145.2882111457474474, - 145.2882111457474474, - 145.2882111457474474 + 145.08643334809677, + 114.35137009963057, + 145.39696498050319, + 145.45827479815388, + 145.72695156997896, + 145.72695156997896 ] }, - "packet": { + "netray_compile": { "Framerate": [ 60, - 60, + 58, 60, 60, 60, 60 ], "Bandwidth": [ - 232.71212768554688, - 185.32768249511719, - 232.73282318115234, - 232.7463119506836, - 232.7463119506836, - 232.7463119506836 - ], - "DrainDuration": 10.798212111000466, - "Sent": 120000, - "Recieve": 120000, + 2.390005350112915, + 1.8530726432800294, + 2.4323086738586427, + 2.463594436645508, + 2.4771370887756349, + 2.4771370887756349 + ], + "DrainDuration": 3.7498374999995578, + "Recieve": 119600, + "Sent": 119600, + "Frames": 598, "NormalizedBandwidth": [ - 232.7122393856112, - 185.32768346764585, - 232.73282531238947, - 232.74631408192074, - 232.74631408192074, - 232.74631408192074 + 2.3900054758743405, + 1.8530727399252989, + 2.4323088007134254, + 2.46359456513197, + 2.4771372179684016, + 2.4771372179684016 ] }, - "roblox": { + "bytenet": { "Framerate": [ 60, 60, @@ -1412,55 +1680,57 @@ 60 ], "Bandwidth": [ - 232.71212768554688, - 185.32768249511719, - 232.73282318115234, - 232.7463119506836, - 232.7463119506836, - 232.7463119506836 - ], - "DrainDuration": 10.798212111000466, - "Sent": 120000, + 2.309868097305298, + 1.8454840183258057, + 2.333796977996826, + 2.3554787635803224, + 2.3859333992004396, + 2.3859333992004396 + ], + "DrainDuration": 3.716698995005572, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 232.7122393856112, - 185.32768346764585, - 232.73282531238947, - 232.74631408192074, - 232.74631408192074, - 232.74631408192074 + 2.309868217774307, + 1.8454841145752977, + 2.3337970997138237, + 2.355478886428113, + 2.385933523636563, + 2.385933523636563 ] }, - "satset": { + "roblox": { "Framerate": [ - 61, + 60, 55, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 2.41763305664062, - 2.21763305664062, - 2.41763305664062, - 2.41763305664062, - 2.41763305664062, - 2.41763305664062 - ], - "DrainDuration": 4.035111124999312, - "Sent": 103200, - "Recieve": 103200, + 231.52804565429688, + 228.96710205078126, + 232.88821411132813, + 232.92637634277345, + 232.92637634277345, + 232.92637634277345 + ], + "DrainDuration": 9.268308947008336, + "Recieve": 118600, + "Sent": 118600, + "Frames": 593, "NormalizedBandwidth": [ - 2.41763305664062, - 2.41763305664062, - 2.41763305664062, - 2.41763305664062, - 2.41763305664062, - 2.41763305664062 + 231.96397083809758, + 228.96711399234619, + 232.92638849083063, + 253.2994244071896, + 253.2994244071896, + 253.2994244071896 ] }, - "bytenet": { + "blink": { "Framerate": [ 61, 60, @@ -1470,84 +1740,120 @@ 61 ], "Bandwidth": [ - 2.21212768554688, - 1.32768249511719, - 2.23282318115234, - 2.2463119506836, - 2.2463119506836, - 2.2463119506836 - ], - "DrainDuration": 3.688212111000466, - "Sent": 120000, + 2.3300230503082277, + 1.87629234790802, + 2.3399951457977297, + 2.3567752838134767, + 2.3567752838134767, + 2.3567752838134767 + ], + "DrainDuration": 3.704949916995247, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.2122393856112, - 1.32768346764585, - 2.23282531238947, - 2.24631408192074, - 2.24631408192074, - 2.24631408192074 + 2.3285805009310147, + 1.8762924457642916, + 2.3399952678379867, + 2.356775406728886, + 2.356775406728886, + 2.356775406728886 ] }, - "netray": { + "zap": { "Framerate": [ - 61, 60, + 54, 61, 61, 61, 61 ], "Bandwidth": [ - 2.36811218261719, - 1.13937759399414, - 2.4276138305664, - 2.47982940673828, - 2.47982940673828, - 2.47982940673828 - ], - "DrainDuration": 3.738211512999013, - "Sent": 120000, - "Recieve": 120000, + 2.387258529663086, + 1.9198942184448243, + 2.4283559322357179, + 2.4355409145355226, + 2.4355409145355226, + 2.4355409145355226 + ], + "DrainDuration": 3.7995638299908025, + "Recieve": 118400, + "Sent": 118400, + "Frames": 592, "NormalizedBandwidth": [ - 2.3142385458312, - 1.13937861993202, - 2.4276159628868, - 2.47983152636222, - 2.47983152636222, - 2.47983152636222 + 2.377474808318438, + 1.9198943185751106, + 2.4355410415588798, + 2.4587105107511948, + 2.4587105107511948, + 2.4587105107511948 ] }, - "zap": { + "packet": { "Framerate": [ - 61, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 2.28212280273438, - 1.27622985839844, - 2.31192321777344, - 2.31192321777344, - 2.31192321777344, - 2.31192321777344 - ], - "DrainDuration": 3.738212112997135, - "Sent": 120000, - "Recieve": 120000, + 2.289534330368042, + 1.8420891761779786, + 2.332875967025757, + 2.3344199657440187, + 2.3497910499572756, + 2.3497910499572756 + ], + "DrainDuration": 3.7332146920089146, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 2.28212403213007, - 1.27623078817734, - 2.3119244473851, - 2.3119244473851, - 2.3119244473851, - 2.3119244473851 + 2.2895344497765626, + 1.8420892722504157, + 2.3328760886947199, + 2.3344200874935074, + 2.3497911725084288, + 2.3497911725084288 ] }, - "blink": { + "satset": { + "DrainDuration": 3.650029887998244, + "DebugStats": { + "reliableCommitBytes": 241602, + "commitGcKb": 0, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 601, + "reliableCommits": 601, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 9392, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 2.385438566640534, + 1.9411599456378737, + 2.437851317710864, + 2.4420696578509117, + 2.4612120481467505, + 2.4612120481467505 + ], "Framerate": [ 60, 60, @@ -1557,24 +1863,36 @@ 60 ], "Bandwidth": [ - 2.35561218261719, - 1.27622985839844, - 2.38111724853516, - 2.41192321777344, - 2.41192321777344, - 2.41192321777344 - ], - "DrainDuration": 3.718212112996553, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 2.35561340989091, - 1.27623078817734, - 2.38111847647248, - 2.4119244473851, - 2.4119244473851, - 2.4119244473851 - ] + 2.3854384422302248, + 1.9411598443984986, + 2.4378511905670168, + 2.4420695304870607, + 2.461211919784546, + 2.461211919784546 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 8374, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -1196, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120801, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 } } } \ No newline at end of file diff --git a/benchmark/latency-mode-result.json b/benchmark/latency-mode-result.json index eb2371a..210704b 100644 --- a/benchmark/latency-mode-result.json +++ b/benchmark/latency-mode-result.json @@ -3,120 +3,94 @@ "warp": { "Framerate": [ 60, - 57, - 60, - 60, - 60, - 60 - ], - "Bandwidth": [ - 2.764441728591919, - 1.4328962564468384, - 2.820237398147583, - 2.820838451385498, - 2.820838451385498, - 2.820838451385498 - ], - "DrainDuration": 3.782715762994485, - "Sent": 96600, - "Recieve": 96600, - "NormalizedBandwidth": [ - 2.7898992562986448, - 1.5145965598851226, - 2.8208385985036878, - 2.8773008914065905, - 2.8773008914065905, - 2.8773008914065905 - ] - }, - "bridgenet2": { - "Framerate": [ - 60, - 60, + 54, 60, 61, 61, 61 ], "Bandwidth": [ - 15659.8876953125, - 12391.0556640625, - 15722.8193359375, - 15762.7939453125, - 15762.7939453125, - 15762.7939453125 - ], - "DrainDuration": 22.01582332000544, - "Sent": 120000, - "Recieve": 120000, + 6.709656715393066, + 1.4099892377853394, + 7.120542049407959, + 8.696324348449707, + 8.696324348449707, + 8.696324348449707 + ], + "DrainDuration": 5.149838657001965, + "Recieve": 107800, + "Sent": 107800, + "Frames": 539, "NormalizedBandwidth": [ - 15659.888512039288, - 12391.056310306412, - 15711.897303814258, - 15722.820155946429, - 15722.820155946429, - 15722.820155946429 + 6.709657065328933, + 1.5797102491326936, + 7.120542420773166, + 8.696324801998366, + 8.696324801998366, + 8.696324801998366 ] }, - "netray_compile": { + "bridgenet2": { "Framerate": [ 60, + 59, 60, 60, - 61, - 61, - 61 + 60, + 60 ], "Bandwidth": [ - 72.5334701538086, - 54.906944274902347, - 72.76528930664063, - 72.81885528564453, - 72.81885528564453, - 72.81885528564453 - ], - "DrainDuration": 8.782914968003752, - "Sent": 119800, + 15613.310546875, + 11969.8486328125, + 15708.1064453125, + 15735.0009765625, + 15743.3115234375, + 15743.3115234375 + ], + "DrainDuration": 22.54962864400295, "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 72.53347393672385, - 54.90694713852264, - 72.79964317877873, - 73.06848178901908, - 73.06848178901908, - 73.06848178901908 + 15613.3113611726, + 11969.849257088754, + 15708.107264554092, + 15735.00179720675, + 15743.31234451518, + 15743.31234451518 ] }, - "bytenet": { + "netray_compile": { "Framerate": [ 60, + 52, 60, 61, 61, - 61, 61 ], "Bandwidth": [ - 72.9428939819336, - 55.87860107421875, - 73.03919219970703, - 73.2262191772461, - 73.2262191772461, - 73.2262191772461 - ], - "DrainDuration": 9.066092023000238, - "Sent": 120000, - "Recieve": 120000, + 71.82942962646485, + 25.026762008666993, + 73.36336517333985, + 73.59359741210938, + 73.59359741210938, + 73.59359741210938 + ], + "DrainDuration": 9.882727651012829, + "Recieve": 108600, + "Sent": 108600, + "Frames": 543, "NormalizedBandwidth": [ - 72.92611555853438, - 55.8786039885149, - 73.0334510746161, - 73.34352595835705, - 73.34352595835705, - 73.34352595835705 + 71.82943337266153, + 29.23799749849648, + 73.3633689995375, + 73.90024122125453, + 73.90024122125453, + 73.90024122125453 ] }, - "roblox": { + "zap": { "Framerate": [ 60, 60, @@ -126,84 +100,131 @@ 60 ], "Bandwidth": [ - 148732.1875, - 68882.234375, - 176976.265625, - 178919.484375, - 202897.765625, - 202897.765625 - ], - "DrainDuration": 9.332765226004995, - "Sent": 120000, + 72.78044128417969, + 54.00513458251953, + 73.04763793945313, + 73.0983657836914, + 73.4731216430664, + 73.4731216430664 + ], + "DrainDuration": 9.532480356007, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 148732.19525698806, - 68882.23796748847, - 176976.27485503153, - 178919.49370637828, - 202897.7762069431, - 202897.7762069431 + 72.7804450799755, + 54.005137399106789, + 73.04764174918432, + 73.09836959606827, + 73.47312547498831, + 73.47312547498831 ] }, - "satset": { + "roblox": { "Framerate": [ 60, 60, 60, - 60, - 60, - 60 + 61, + 61, + 61 ], "Bandwidth": [ - 38.990421295166019, - 29.033836364746095, - 39.19265365600586, - 39.27354431152344, - 39.325870513916019, - 39.325870513916019 - ], - "DrainDuration": 7.732752484997036, - "Sent": 120000, + 174809.515625, + 100636.25, + 209766.03125, + 214198.3125, + 214198.3125, + 214198.3125 + ], + "DrainDuration": 9.866745417006314, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 38.99042332867495, - 29.03383787897866, - 39.19265570006203, - 39.27354635979839, - 39.32587256491999, - 39.32587256491999 + 174809.5247420267, + 101055.57293192949, + 209766.04219015107, + 213320.4617871618, + 213320.4617871618, + 213320.4617871618 ] }, - "packet": { + "satset": { + "DrainDuration": 8.215696908999235, + "DebugStats": { + "reliableCommitBytes": 72601200, + "commitGcKb": 118, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 600, + "reliableCommits": 600, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 1, + "streamGrowthBytes": 131072, + "adapterGcSamples": 120000, + "sendGcSamples": 240001, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 8127, + "sendGcKb": 131, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120000, + "Frames": 600, + "NormalizedBandwidth": [ + 38.83786594767159, + 29.728144561102256, + 39.110662592758419, + 39.11792577673097, + 39.11792577673097, + 39.11792577673097 + ], "Framerate": [ 60, 60, - 60, - 60, - 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 72.66801452636719, - 55.08686828613281, - 73.01099395751953, - 73.1099624633789, - 73.3668441772461, - 73.3668441772461 - ], - "DrainDuration": 8.866096705009113, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 72.66801831629948, - 55.08687115913688, - 73.0109977653396, - 73.10996627636058, - 73.3668480036252, - 73.3668480036252 - ] + 38.83786392211914, + 29.60478973388672, + 39.117923736572269, + 39.164852142333987, + 39.164852142333987, + 39.164852142333987 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 200269, + "listenerCallGcSamples": 120000, + "packetDecodeGcSamples": 120000, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -1845, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120600, + "receiveDecodeGcKb": 2 + }, + "Recieve": 120000 }, - "blink": { + "bytenet": { "Framerate": [ 60, 60, @@ -213,26 +234,27 @@ 61 ], "Bandwidth": [ - 72.8770751953125, - 56.13698959350586, - 72.98052978515625, - 73.06175994873047, - 73.06175994873047, - 73.06175994873047 - ], - "DrainDuration": 8.799909338995349, - "Sent": 120000, + 72.5946044921875, + 48.951656341552737, + 72.68463897705078, + 72.85352325439453, + 72.85352325439453, + 72.85352325439453 + ], + "DrainDuration": 10.316452951999964, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 72.6814330773089, - 55.90692290550966, - 72.9588966273684, - 73.36618774083948, - 73.36618774083948, - 73.36618774083948 + 72.56147381611385, + 48.95165889458056, + 72.68464276785011, + 72.85352705400186, + 72.85352705400186, + 72.85352705400186 ] }, - "zap": { + "packet": { "Framerate": [ 60, 60, @@ -242,23 +264,54 @@ 60 ], "Bandwidth": [ - 72.64482879638672, - 55.25006103515625, - 72.87446594238281, - 72.88887023925781, - 72.99724578857422, - 72.99724578857422 - ], - "DrainDuration": 8.849431556009222, - "Sent": 120000, + 72.8536148071289, + 54.42557907104492, + 72.95780944824219, + 72.96881866455078, + 73.09724426269531, + 73.09724426269531 + ], + "DrainDuration": 10.084193439004594, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 72.64483258510978, - 55.25006391667148, - 72.87446974308239, - 72.88887404070863, - 72.99724959567726, - 72.99724959567726 + 72.85361860674101, + 54.425581909560069, + 72.95781325328847, + 72.96882247017124, + 73.09724807501368, + 73.09724807501368 + ] + }, + "blink": { + "Framerate": [ + 60, + 60, + 60, + 60, + 61, + 61 + ], + "Bandwidth": [ + 72.62368774414063, + 55.93399429321289, + 72.85077667236328, + 72.93170928955078, + 72.97710418701172, + 72.97710418701172 + ], + "DrainDuration": 9.499660818997655, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 72.62098309656125, + 55.93399721039802, + 72.85078047182737, + 72.93171309323583, + 72.9771079930643, + 72.9771079930643 ] } }, @@ -273,52 +326,54 @@ 60 ], "Bandwidth": [ - 2.447920799255371, - 2.340574026107788, - 2.484408140182495, - 2.508678913116455, - 4.404301643371582, - 4.404301643371582 - ], - "DrainDuration": 3.8168795419915115, - "Sent": 120000, + 2.5086474418640138, + 2.4267008304595949, + 2.5434975624084474, + 2.599701404571533, + 4.8839430809021, + 4.8839430809021 + ], + "DrainDuration": 3.833497883999371, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.4479209269243897, - 2.340574148178236, - 2.4844082697544769, - 2.508679043954256, - 4.404301873073813, - 4.404301873073813 + 2.5086475727001735, + 2.4267009570219058, + 2.5434976950621825, + 2.599701540156527, + 4.8839433356195809, + 4.8839433356195809 ] }, "bridgenet2": { "Framerate": [ - 55, - 49, - 57, - 57, - 57, - 57 + 52, + 50, + 52, + 52, + 52, + 52 ], "Bandwidth": [ - 21750.3515625, - 17700.634765625, - 22568.650390625, - 22712.251953125, - 22712.251953125, - 22712.251953125 - ], - "DrainDuration": 26.04329594099545, - "Sent": 107800, - "Recieve": 107800, + 20440.36328125, + 14222.26953125, + 20817.8203125, + 20830.083984375, + 20830.083984375, + 20830.083984375 + ], + "DrainDuration": 23.72997330999351, + "Recieve": 102200, + "Sent": 102200, + "Frames": 511, "NormalizedBandwidth": [ - 24007.249926893564, - 18787.516740806925, - 25090.393220684535, - 26944.340773374064, - 26944.340773374064, - 26944.340773374064 + 23969.856756586956, + 17208.946823698858, + 24235.002486936766, + 24259.964925092096, + 24259.964925092096, + 24259.964925092096 ] }, "netray_compile": { @@ -326,202 +381,253 @@ 60, 60, 60, - 61, - 61, - 61 + 60, + 60, + 60 ], "Bandwidth": [ - 10.281547546386719, - 7.180410861968994, - 10.323692321777344, - 10.326251029968262, - 10.326251029968262, - 10.326251029968262 - ], - "DrainDuration": 5.266024893993745, - "Sent": 120000, + 10.411065101623536, + 7.795403957366943, + 10.457037925720215, + 10.478292465209961, + 10.514304161071778, + 10.514304161071778 + ], + "DrainDuration": 5.517919953999808, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 10.273659288254465, - 7.180411236456603, - 10.32625156852422, - 10.366708242310012, - 10.366708242310012, - 10.366708242310012 + 10.411065644602893, + 7.795404363928942, + 10.457038471097242, + 10.478293011695499, + 10.514304709435472, + 10.514304709435472 ] }, - "bytenet": { + "zap": { "Framerate": [ 60, 60, 60, - 61, - 61, - 61 + 60, + 60, + 60 ], "Bandwidth": [ - 19.037439346313478, - 14.59847354888916, - 19.096935272216798, - 19.101850509643556, - 19.101850509643556, - 19.101850509643556 - ], - "DrainDuration": 6.328172858004109, - "Sent": 119800, - "Recieve": 119800, + 29.41815948486328, + 22.286975860595704, + 29.495773315429689, + 29.504188537597658, + 29.623083114624025, + 29.623083114624025 + ], + "DrainDuration": 7.56714076299977, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 18.945279040047514, - 14.598474310258887, - 19.06402500133346, - 19.0969363037704, - 19.0969363037704, - 19.0969363037704 + 29.41816101913986, + 22.286977022952074, + 29.495774853754143, + 29.504190076361, + 29.6230846595882, + 29.6230846595882 ] }, "roblox": { "Framerate": [ - 50, - 49, - 52, - 52, - 52, - 52 + 47, + 46, + 47, + 48, + 48, + 48 ], "Bandwidth": [ - 53546.9609375, - 48074.2578125, - 54663.33984375, - 57044.5859375, - 57044.5859375, - 57044.5859375 - ], - "DrainDuration": 11.325150161006605, - "Sent": 99400, - "Recieve": 99400, + 54850.5, + 50982.9921875, + 58248.68359375, + 58498.89453125, + 58498.89453125, + 58498.89453125 + ], + "DrainDuration": 10.883574213992688, + "Recieve": 93200, + "Sent": 93200, + "Frames": 466, "NormalizedBandwidth": [ - 63524.20128242976, - 58636.994590338, - 67751.19841846568, - 70141.56062914123, - 70141.56062914123, - 70141.56062914123 + 71744.48005270695, + 66654.17844951219, + 74609.2600992908, + 75301.77151548857, + 75301.77151548857, + 75301.77151548857 ] }, "satset": { + "DrainDuration": 5.733056135009974, + "DebugStats": { + "reliableCommitBytes": 15627202, + "commitGcKb": 25, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 601, + "reliableCommits": 601, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 9384, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 10.378378455703299, + 8.016314906988994, + 10.436980791828497, + 10.473319364547969, + 10.473319364547969, + 10.473319364547969 + ], "Framerate": [ 60, 60, - 60, - 60, - 60, - 60 + 61, + 61, + 61, + 61 ], "Bandwidth": [ - 10.376862525939942, - 7.734817028045654, - 10.407729148864746, - 10.408055305480957, - 10.421064376831055, - 10.421064376831055 - ], - "DrainDuration": 5.28272814299271, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 10.376863067135496, - 7.734817431447798, - 10.40772969167012, - 10.408055848303342, - 10.421064920331915, - 10.421064920331915 - ] + 10.39358901977539, + 7.983051776885986, + 10.430319786071778, + 10.436980247497559, + 10.436980247497559, + 10.436980247497559 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 893668, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -897841, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120801, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 }, - "packet": { + "bytenet": { "Framerate": [ 60, - 54, + 60, 60, 61, 61, 61 ], "Bandwidth": [ - 28.786466598510743, - 21.48399543762207, - 29.15029525756836, - 29.432878494262697, - 29.432878494262697, - 29.432878494262697 - ], - "DrainDuration": 7.313814018998528, - "Sent": 109000, - "Recieve": 109000, + 19.176868438720704, + 14.401999473571778, + 19.27757453918457, + 19.283002853393556, + 19.283002853393556, + 19.283002853393556 + ], + "DrainDuration": 6.567377958999714, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 28.895067833989999, - 21.663030082844409, - 29.514675772655609, - 30.427802018942939, - 30.427802018942939, - 30.427802018942939 + 19.17686943887233, + 14.402000224694583, + 19.283003859080524, + 19.352660432438755, + 19.352660432438755, + 19.352660432438755 ] }, - "blink": { + "packet": { "Framerate": [ + 58, + 57, + 58, 60, 60, - 61, - 61, - 61, - 61 + 60 ], "Bandwidth": [ - 29.26051139831543, - 22.337413787841798, - 29.318355560302736, - 29.335769653320314, - 29.335769653320314, - 29.335769653320314 - ], - "DrainDuration": 7.297905995990732, - "Sent": 120000, - "Recieve": 120000, + 26.09518814086914, + 19.7695369720459, + 28.519512176513673, + 29.08045768737793, + 29.08045768737793, + 29.08045768737793 + ], + "DrainDuration": 7.360662229999434, + "Recieve": 115800, + "Sent": 115800, + "Frames": 579, "NormalizedBandwidth": [ - 29.19819990161679, - 22.2458681804663, - 29.335771183299927, - 29.422323500054497, - 29.422323500054497, - 29.422323500054497 + 27.071632823912127, + 20.536459916930484, + 29.44396522846702, + 29.502945554249235, + 29.502945554249235, + 29.502945554249235 ] }, - "zap": { + "blink": { "Framerate": [ 60, 60, 60, - 61, + 60, 61, 61 ], "Bandwidth": [ - 29.381929397583009, - 21.87703514099121, - 29.435056686401368, - 29.541475296020509, - 29.541475296020509, - 29.541475296020509 - ], - "DrainDuration": 7.267011803996866, - "Sent": 119800, - "Recieve": 119800, + 29.401473999023439, + 22.449277877807618, + 29.4440975189209, + 29.45580291748047, + 29.459657669067384, + 29.459657669067384 + ], + "DrainDuration": 7.4836189199995719, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 29.38193092997004, - 21.877036281967507, - 29.423049553940716, - 29.5577042837756, - 29.5577042837756, - 29.5577042837756 + 29.4014755324298, + 22.449279048628698, + 29.44409905455025, + 29.45965920550826, + 29.578536958561047, + 29.578536958561047 ] } }, @@ -530,90 +636,93 @@ "Framerate": [ 60, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 2.2454726696014406, - 1.8616403341293336, - 2.325646162033081, - 2.3369789123535158, - 2.3369789123535158, - 2.3369789123535158 - ], - "DrainDuration": 3.8144485960074236, - "Sent": 119800, - "Recieve": 119800, + 2.285691976547241, + 2.0940165519714357, + 2.4591119289398195, + 2.503413677215576, + 2.5347096920013429, + 2.5347096920013429 + ], + "DrainDuration": 3.6146651309973096, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.245472786711966, - 1.861640431221443, - 2.3256462833249804, - 2.346716445790875, - 2.346716445790875, - 2.346716445790875 + 2.2856920957553674, + 2.094016661182909, + 2.4591120571925009, + 2.5034138077787739, + 2.5347098241967549, + 2.5347098241967549 ] }, "bridgenet2": { "Framerate": [ 60, - 55, 60, 60, - 60, - 60 + 61, + 61, + 61 ], "Bandwidth": [ - 1680.568603515625, - 1323.0751953125, - 1682.277587890625, - 1683.3160400390626, - 1683.3160400390626, - 1683.3160400390626 - ], - "DrainDuration": 17.761656613001834, - "Sent": 89800, - "Recieve": 89800, + 1680.3319091796876, + 1333.3367919921876, + 1682.7130126953126, + 1683.593505859375, + 1683.593505859375, + 1683.593505859375 + ], + "DrainDuration": 16.98342470198986, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 1681.1296042792993, - 1323.0752643162487, - 1683.3161278308353, - 1820.4390354684579, - 1820.4390354684579, - 1820.4390354684579 + 1680.3319968158258, + 1333.3368615311202, + 1682.713100455635, + 1683.5935936656188, + 1683.5935936656188, + 1683.5935936656188 ] }, "netray_compile": { "Framerate": [ 60, 60, - 61, + 60, 61, 61, 61 ], "Bandwidth": [ - 4.93384313583374, - 3.7336151599884035, - 4.954408645629883, - 4.975438117980957, - 4.975438117980957, - 4.975438117980957 - ], - "DrainDuration": 4.250556561994017, - "Sent": 120000, + 4.987257480621338, + 3.819934844970703, + 5.054417610168457, + 5.069162368774414, + 5.069162368774414, + 5.069162368774414 + ], + "DrainDuration": 4.383725410996703, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 4.933843393153712, - 3.733615354711608, - 4.954408904022429, - 4.975438377470276, - 4.975438377470276, - 4.975438377470276 + 4.987257740727085, + 3.8042795744528599, + 5.0544178737768779, + 5.069162633151834, + 5.069162633151834, + 5.069162633151834 ] }, - "bytenet": { + "zap": { "Framerate": [ 60, 60, @@ -623,23 +732,24 @@ 60 ], "Bandwidth": [ - 4.901780605316162, - 3.8276753425598146, - 4.975456237792969, - 4.991796970367432, - 5.037708282470703, - 5.037708282470703 - ], - "DrainDuration": 4.216418586001964, - "Sent": 120000, + 4.97285795211792, + 4.023661136627197, + 5.1511945724487309, + 5.165728569030762, + 5.211760997772217, + 5.211760997772217 + ], + "DrainDuration": 4.583293417003006, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 4.901780860963942, - 3.82767554218864, - 4.975456497283233, - 4.991797230709931, - 5.037708545207664, - 5.037708545207664 + 4.972858211472673, + 4.023661346477478, + 5.151194841104463, + 5.165728838444501, + 5.211761269586734, + 5.211761269586734 ] }, "roblox": { @@ -652,26 +762,60 @@ 60 ], "Bandwidth": [ - 3902.99658203125, - 3682.523193359375, - 4031.613525390625, - 4065.48876953125, - 4065.48876953125, - 4065.48876953125 - ], - "DrainDuration": 9.315510572007043, - "Sent": 119800, - "Recieve": 119800, + 3558.9931640625, + 3427.2333984375, + 3706.50439453125, + 3745.291015625, + 3847.739013671875, + 3847.739013671875 + ], + "DrainDuration": 9.383830263992423, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 3902.9967855883844, - 3682.523385417926, - 4031.6137356556557, - 4065.488981563012, - 4065.488981563012, - 4065.488981563012 + 3558.993349678458, + 3427.2335771816508, + 3706.504587840518, + 3745.291210957148, + 3847.7392143471026, + 3847.7392143471026 ] }, "satset": { + "DrainDuration": 4.217027832011809, + "DebugStats": { + "reliableCommitBytes": 3841200, + "commitGcKb": 7, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 600, + "reliableCommits": 600, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120000, + "sendGcSamples": 240000, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120000, + "Frames": 600, + "NormalizedBandwidth": [ + 4.31099437309026, + 3.3748039575191326, + 4.396046390923285, + 4.417518369277023, + 4.4220998209319799, + 4.4220998209319799 + ], "Framerate": [ 60, 60, @@ -681,26 +825,38 @@ 60 ], "Bandwidth": [ - 4.293588161468506, - 3.270570755004883, - 4.32204008102417, - 4.324096202850342, - 4.366925239562988, - 4.366925239562988 - ], - "DrainDuration": 4.217419569002232, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 4.293588385396578, - 3.27057092557844, - 4.322040306436126, - 4.324096428369533, - 4.3669254673158879, - 4.3669254673158879 - ] + 4.3109941482543949, + 3.3748037815093996, + 4.396046161651611, + 4.417518138885498, + 4.422099590301514, + 4.422099590301514 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 33733, + "listenerCallGcSamples": 120000, + "packetDecodeGcSamples": 120000, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -815, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120600, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120000 }, - "packet": { + "bytenet": { "Framerate": [ 60, 60, @@ -710,55 +866,57 @@ 61 ], "Bandwidth": [ - 4.803657531738281, - 3.796332597732544, - 4.824338912963867, - 4.825944900512695, - 4.825944900512695, - 4.825944900512695 - ], - "DrainDuration": 4.199859785003355, - "Sent": 120000, + 4.859020233154297, + 3.9970057010650636, + 5.129150867462158, + 5.145942211151123, + 5.145942211151123, + 5.145942211151123 + ], + "DrainDuration": 4.64927950699348, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 4.8045672849604099, - 3.8121508472744409, - 4.816999171817148, - 4.846053254758935, - 4.846053254758935, - 4.846053254758935 + 4.85902048657195, + 3.9970059169701588, + 5.129151134968222, + 5.145942479532923, + 5.145942479532923, + 5.145942479532923 ] }, - "blink": { + "packet": { "Framerate": [ 60, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 4.998149871826172, - 3.912663221359253, - 5.013729095458984, - 5.015888214111328, - 5.015888214111328, - 5.015888214111328 - ], - "DrainDuration": 4.198811416004901, - "Sent": 120000, + 4.7038164138793949, + 3.645994186401367, + 4.75673770904541, + 4.799077987670898, + 4.884762287139893, + 4.884762287139893 + ], + "DrainDuration": 4.366468509004335, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 4.998150132500001, - 3.9126634254205419, - 5.015888475710284, - 5.021390465179062, - 5.021390465179062, - 5.021390465179062 + 4.703816659202538, + 3.645994376554782, + 4.756737957128614, + 4.79907823796232, + 4.884762541900098, + 4.884762541900098 ] }, - "zap": { + "blink": { "Framerate": [ 60, 60, @@ -768,173 +926,212 @@ 60 ], "Bandwidth": [ - 4.982448577880859, - 3.807426691055298, - 5.024774551391602, - 5.049847602844238, - 5.059690952301025, - 5.059690952301025 - ], - "DrainDuration": 4.283437647012761, - "Sent": 120000, - "Recieve": 120000, + 5.011424541473389, + 3.9369800090789797, + 5.033984184265137, + 5.068098545074463, + 5.081544399261475, + 5.081544399261475 + ], + "DrainDuration": 4.716122358004213, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 4.982448837735802, - 3.807426889628074, - 5.024774813454016, - 5.049847866214314, - 5.059691216184472, - 5.059691216184472 + 5.011424802839546, + 3.9369802144084877, + 5.033984446807871, + 5.0680988093964, + 5.081544664284667, + 5.081544664284667 ] } }, "Entities": { "warp": { "Framerate": [ - 50, - 40, - 52, 52, + 48, 52, - 52 + 53, + 53, + 53 ], "Bandwidth": [ - 8.710792541503907, - 4.467971324920654, - 10.118857383728028, - 10.149181365966797, - 10.149181365966797, - 10.149181365966797 - ], - "DrainDuration": 5.2914539460034579, - "Sent": 87600, - "Recieve": 87600, + 9.991240501403809, + 7.457734107971191, + 11.156453132629395, + 11.567028999328614, + 11.567028999328614, + 11.567028999328614 + ], + "DrainDuration": 7.008535045009921, + "Recieve": 100200, + "Sent": 100200, + "Frames": 501, "NormalizedBandwidth": [ - 10.895018055909928, - 6.757806987631254, - 11.815462019070863, - 11.870198790826985, - 11.870198790826985, - 11.870198790826985 + 12.039445493511014, + 8.963623217458578, + 13.791458409616113, + 13.808304795985452, + 13.808304795985452, + 13.808304795985452 ] }, "bridgenet2": { "Framerate": [ - 17, - 16, - 17, 18, + 17, 18, - 18 + 19, + 19, + 19 ], "Bandwidth": [ - 23520.376953125, - 12758.107421875, - 27017.2109375, - 27022.33203125, - 27022.33203125, - 27022.33203125 - ], - "DrainDuration": 26.51570917101344, - "Sent": 27000, - "Recieve": 27000, + 28973.953125, + 13049.1376953125, + 31393.55859375, + 33632.66015625, + 33632.66015625, + 33632.66015625 + ], + "DrainDuration": 27.845124879007927, + "Recieve": 30200, + "Sent": 30200, + "Frames": 151, "NormalizedBandwidth": [ - 87240.7040796132, - 42527.02640305121, - 97738.73922716463, - 101333.75009127376, - 101333.75009127376, - 101333.75009127376 + 98591.92874522704, + 41894.60215413484, + 109005.41620196977, + 120187.30636667559, + 120187.30636667559, + 120187.30636667559 ] }, "netray_compile": { "Framerate": [ 60, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 38.93456268310547, - 28.886159896850587, - 38.98399353027344, - 38.98530578613281, - 38.98530578613281, - 38.98530578613281 - ], - "DrainDuration": 7.833227431008709, - "Sent": 120000, + 38.96963882446289, + 28.8632755279541, + 39.038116455078128, + 39.07029724121094, + 39.072296142578128, + 39.072296142578128 + ], + "DrainDuration": 8.316689771003439, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 38.891821028610568, - 29.00652039577748, - 38.98399556344714, - 38.98530781937495, - 38.98530781937495, - 38.98530781937495 + 38.969640856887938, + 28.863277033291227, + 39.038118491074559, + 39.07029927888573, + 39.072298180357169, + 39.072298180357169 ] }, - "bytenet": { + "zap": { "Framerate": [ 60, - 57, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 38.159420013427737, - 29.424619674682618, - 38.9777946472168, - 39.206695556640628, - 39.206695556640628, - 39.206695556640628 - ], - "DrainDuration": 7.782035968004493, - "Sent": 118800, - "Recieve": 118800, + 38.96997833251953, + 29.015649795532228, + 39.00817108154297, + 39.02146530151367, + 39.12831497192383, + 39.12831497192383 + ], + "DrainDuration": 8.400210028004949, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 38.58125714508226, - 29.547223811370097, - 39.20669763794322, - 39.610457282828189, - 39.610457282828189, - 39.610457282828189 + 38.96998036496228, + 29.015651308816289, + 39.00817311597763, + 39.02146733664168, + 39.12831701262448, + 39.12831701262448 ] }, "roblox": { "Framerate": [ 18, + 17, 18, 19, 19, - 19, 19 ], "Bandwidth": [ - 208655.3125, - 184098.6875, - 211734.09375, - 213581.03125, - 213581.03125, - 213581.03125 - ], - "DrainDuration": 14.778737654996803, - "Sent": 34800, - "Recieve": 34800, + 197299.859375, + 182099.53125, + 212456.8125, + 217581.34375, + 217581.34375, + 217581.34375 + ], + "DrainDuration": 14.265211578996969, + "Recieve": 34200, + "Sent": 34200, + "Frames": 171, "NormalizedBandwidth": [ - 707109.71090404, - 618776.1803695357, - 720484.1075725526, - 721747.0565034436, - 721747.0565034436, - 721747.0565034436 + 690549.5426024647, + 629760.9114681836, + 738742.9832118796, + 780733.0848301966, + 780733.0848301966, + 780733.0848301966 ] }, "satset": { + "DrainDuration": 8.322948571003508, + "DebugStats": { + "reliableCommitBytes": 72722202, + "commitGcKb": 0, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 601, + "reliableCommits": 601, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 7869, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 39.15123952968912, + 29.455731974468479, + 39.24122442818103, + 39.258817812887659, + 39.273450992361777, + 39.273450992361777 + ], "Framerate": [ 60, 60, @@ -944,84 +1141,130 @@ 60 ], "Bandwidth": [ - 38.97240447998047, - 28.81517219543457, - 39.12338638305664, - 39.136940002441409, - 39.13933181762695, - 39.13933181762695 - ], - "DrainDuration": 7.8001610320061449, - "Sent": 120000, - "Recieve": 120000, + 39.15123748779297, + 29.455730438232423, + 39.2412223815918, + 39.25881576538086, + 39.2734489440918, + 39.2734489440918 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 88813, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -2994, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120801, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 + }, + "bytenet": { + "Framerate": [ + 60, + 60, + 61, + 61, + 61, + 61 + ], + "Bandwidth": [ + 39.04008483886719, + 29.01456069946289, + 39.21613311767578, + 39.225399017333987, + 39.225399017333987, + 39.225399017333987 + ], + "DrainDuration": 8.350599078999949, + "Recieve": 119800, + "Sent": 119800, + "Frames": 599, "NormalizedBandwidth": [ - 38.97240651254975, - 28.81517369826291, - 39.123388423500248, - 39.13694204359189, - 39.13933385890218, - 39.13933385890218 + 39.04008771122126, + 29.256351014764783, + 39.45072944186563, + 39.55228050123543, + 39.55228050123543, + 39.55228050123543 ] }, "packet": { "Framerate": [ - 51, - 48, + 52, + 50, 52, 52, 52, 52 ], "Bandwidth": [ - 30.554224014282228, - 22.863338470458986, - 32.05663299560547, - 33.080440521240237, - 33.080440521240237, - 33.080440521240237 - ], - "DrainDuration": 7.531132645992329, - "Sent": 100200, - "Recieve": 100200, + 30.11553955078125, + 20.197500228881837, + 31.87305450439453, + 32.00583267211914, + 32.00583267211914, + 32.00583267211914 + ], + "DrainDuration": 8.339981492012157, + "Recieve": 102000, + "Sent": 102000, + "Frames": 510, "NormalizedBandwidth": [ - 36.77355554879297, - 27.122196900753069, - 38.037682241174199, - 39.442065648820719, - 39.442065648820719, - 39.442065648820719 + 35.430048180170988, + 23.499015784715494, + 37.39143131132933, + 38.24766722194006, + 38.24766722194006, + 38.24766722194006 ] }, "blink": { "Framerate": [ 60, 60, - 61, - 61, + 60, + 60, 61, 61 ], "Bandwidth": [ - 39.00115203857422, - 29.122724533081056, - 39.026817321777347, - 39.04824447631836, - 39.04824447631836, - 39.04824447631836 - ], - "DrainDuration": 7.514331072990899, - "Sent": 120000, - "Recieve": 120000, + 38.97825241088867, + 29.38810157775879, + 38.99757385253906, + 39.017723083496097, + 39.03395080566406, + 39.03395080566406 + ], + "DrainDuration": 8.263846114001354, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 38.97832692301478, - 29.1227260519495, - 39.04824651284301, - 39.16365886311749, - 39.16365886311749, - 39.16365886311749 + 38.97825444376295, + 29.388103110467726, + 38.99757588642103, + 39.01772511842893, + 39.03395284144324, + 39.03395284144324 ] - }, - "zap": { + } + }, + "Strings": { + "warp": { "Framerate": [ 60, 60, @@ -1031,28 +1274,27 @@ 60 ], "Bandwidth": [ - 38.95712661743164, - 29.078960418701173, - 39.0257682800293, - 39.05777359008789, - 39.10287857055664, - 39.10287857055664 - ], - "DrainDuration": 7.833464256007574, - "Sent": 120000, + 4.443981647491455, + 3.3753182888031008, + 5.856051445007324, + 6.189422130584717, + 6.478349685668945, + 6.478349685668945 + ], + "DrainDuration": 4.317077106999932, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 38.95712864920412, - 29.078961989450926, - 39.02577031538172, - 39.05777562710952, - 39.10288060993068, - 39.10288060993068 + 4.443981879263159, + 3.3753184648396674, + 5.856051750424207, + 6.189422453388236, + 6.478350023541211, + 6.478350023541211 ] - } - }, - "Strings": { - "warp": { + }, + "bridgenet2": { "Framerate": [ 60, 60, @@ -1062,55 +1304,150 @@ 60 ], "Bandwidth": [ - 3.385514497756958, - 3.21207332611084, - 5.507931709289551, - 6.249972820281982, - 7.934593677520752, - 7.934593677520752 - ], - "DrainDuration": 3.7656679959909526, + 27457.384765625, + 21161.580078125, + 27694.439453125, + 27980.609375, + 28068.15625, + 28068.15625 + ], + "DrainDuration": 25.232977284002119, + "Recieve": 120000, "Sent": 120000, + "Frames": 600, + "NormalizedBandwidth": [ + 27457.386197639207, + 21161.58122120392, + 27694.440897502573, + 27980.610834302497, + 28068.157713868422, + 28068.157713868422 + ] + }, + "netray_compile": { + "Framerate": [ + 60, + 60, + 61, + 61, + 61, + 61 + ], + "Bandwidth": [ + 96.4015884399414, + 72.80319213867188, + 96.70467376708985, + 96.89170837402344, + 96.89170837402344, + 96.89170837402344 + ], + "DrainDuration": 11.949982346995967, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 3.3855146743252986, - 3.2120734936335184, - 5.507931996550575, - 6.249973146243466, - 7.93459409134206, - 7.93459409134206 + 96.3110630674467, + 73.1065425514845, + 96.7046788106316, + 96.89171342731982, + 96.89171342731982, + 96.89171342731982 ] }, - "bridgenet2": { + "zap": { "Framerate": [ 60, - 55, 60, 60, + 61, + 61, + 61 + ], + "Bandwidth": [ + 100.43354797363281, + 67.98133087158203, + 100.70870208740235, + 100.7239990234375, + 100.7239990234375, + 100.7239990234375 + ], + "DrainDuration": 10.317053609993309, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, + "NormalizedBandwidth": [ + 100.2959667820463, + 67.98133441708473, + 100.72400427660341, + 101.01239020824147, + 101.01239020824147, + 101.01239020824147 + ] + }, + "roblox": { + "Framerate": [ 60, - 60 + 60, + 60, + 61, + 61, + 61 ], "Bandwidth": [ - 27012.642578125, - 19714.439453125, - 27200.52734375, - 27309.103515625, - 27309.103515625, - 27309.103515625 - ], - "DrainDuration": 24.265411052998389, - "Sent": 106200, - "Recieve": 106200, + 62755.31640625, + 47559.0078125, + 146779.453125, + 160764.46875, + 160764.46875, + 160764.46875 + ], + "DrainDuration": 13.047871394010145, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 27071.311958753868, - 21410.245237316405, - 27309.104939905737, - 27523.818904290434, - 27523.818904290434, - 27523.818904290434 + 62755.3196791948, + 47364.09633806866, + 146779.46078014503, + 161434.32904771914, + 161434.32904771914, + 161434.32904771914 ] }, - "netray_compile": { + "satset": { + "DrainDuration": 10.333382266006084, + "DebugStats": { + "reliableCommitBytes": 260281200, + "commitGcKb": 424, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 600, + "reliableCommits": 600, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 2, + "streamGrowthBytes": 786432, + "adapterGcSamples": 120000, + "sendGcSamples": 240002, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 7168, + "sendGcKb": 769, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120000, + "Frames": 600, + "NormalizedBandwidth": [ + 96.37056471849917, + 73.8260689138059, + 96.86780290361185, + 96.93914537559437, + 97.09934741031674, + 97.09934741031674 + ], "Framerate": [ 60, 60, @@ -1120,24 +1457,36 @@ 60 ], "Bandwidth": [ - 96.54653930664063, - 72.74851989746094, - 96.86563873291016, - 97.10099792480469, - 97.40682983398438, - 97.40682983398438 - ], - "DrainDuration": 10.832776184994146, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 96.54654434193503, - 72.74852369159192, - 96.8656437848469, - 97.10100298901637, - 97.40683491414643, - 97.40683491414643 - ] + 96.37055969238281, + 73.82606506347656, + 96.8677978515625, + 96.93914031982422, + 97.0993423461914, + 97.0993423461914 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 159692, + "listenerCallGcSamples": 120000, + "packetDecodeGcSamples": 120000, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": 2, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120600, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120000 }, "bytenet": { "Framerate": [ @@ -1156,9 +1505,10 @@ 0, 0 ], - "DrainDuration": 3.010798364994116, - "Sent": 1600, + "DrainDuration": 4.535122966000927, "Recieve": 1600, + "Sent": 1600, + "Frames": 8, "NormalizedBandwidth": [ 0, 0, @@ -1168,64 +1518,6 @@ 0 ] }, - "roblox": { - "Framerate": [ - 56, - 53, - 60, - 61, - 61, - 61 - ], - "Bandwidth": [ - 53459.51171875, - 39032.52734375, - 82090.7578125, - 116585.578125, - 116585.578125, - 116585.578125 - ], - "DrainDuration": 10.945210890000454, - "Sent": 112200, - "Recieve": 112200, - "NormalizedBandwidth": [ - 58319.470805656594, - 41820.56773755125, - 85275.31763855576, - 127184.27450777802, - 127184.27450777802, - 127184.27450777802 - ] - }, - "satset": { - "Framerate": [ - 60, - 60, - 60, - 60, - 60, - 60 - ], - "Bandwidth": [ - 96.43982696533203, - 72.35977172851563, - 96.58458709716797, - 96.72514343261719, - 96.90149688720703, - 96.90149688720703 - ], - "DrainDuration": 9.882589490996907, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 96.43983199506096, - 72.3597755023718, - 96.58459213444672, - 96.72514847722653, - 96.90150194101392, - 96.90150194101392 - ] - }, "packet": { "Framerate": [ 60, @@ -1236,55 +1528,27 @@ 61 ], "Bandwidth": [ - 96.45869445800781, - 72.38963317871094, - 96.79341888427735, - 97.13880920410156, - 97.13880920410156, - 97.13880920410156 - ], - "DrainDuration": 9.866840552000213, - "Sent": 120000, + 95.9897689819336, + 72.84919738769531, + 96.62486267089844, + 96.62947845458985, + 96.62947845458985, + 96.62947845458985 + ], + "DrainDuration": 10.433760499989149, "Recieve": 120000, - "NormalizedBandwidth": [ - 96.42791488018162, - 72.69126040772432, - 96.74070442022716, - 96.89167679308182, - 96.89167679308182, - 96.89167679308182 - ] - }, - "blink": { - "Framerate": [ - 60, - 60, - 60, - 60, - 60, - 60 - ], - "Bandwidth": [ - 99.93290710449219, - 68.13643646240235, - 100.39676666259766, - 100.58865356445313, - 100.66536712646485, - 100.66536712646485 - ], - "DrainDuration": 9.863170425000135, "Sent": 120000, - "Recieve": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 99.93291231639944, - 68.13644001599443, - 100.39677189869707, - 100.58865881056022, - 100.66537237657286, - 100.66537237657286 + 95.98977398819017, + 72.84920118707703, + 96.62486771027773, + 96.62948349420987, + 96.62948349420987, + 96.62948349420987 ] }, - "zap": { + "blink": { "Framerate": [ 60, 60, @@ -1294,23 +1558,24 @@ 60 ], "Bandwidth": [ - 100.30909729003906, - 72.05551147460938, - 100.70087432861328, - 100.71550750732422, - 100.72301483154297, - 100.72301483154297 - ], - "DrainDuration": 9.86579776200233, - "Sent": 120000, - "Recieve": 120000, + 100.05217742919922, + 75.12348175048828, + 100.24107360839844, + 100.26873779296875, + 100.42533111572266, + 100.42533111572266 + ], + "DrainDuration": 12.300088531002985, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 100.30910252156616, - 72.05551523259715, - 100.70087958057315, - 100.71551276004726, - 100.72302008465755, - 100.72302008465755 + 100.0521826473269, + 75.12348566848317, + 100.24107883637783, + 100.26874302239094, + 100.42533635331182, + 100.42533635331182 ] } }, @@ -1320,57 +1585,59 @@ 60, 60, 60, - 60, - 60, - 60 + 61, + 61, + 61 ], "Bandwidth": [ - 2.2502639293670656, - 1.965975284576416, - 2.418292760848999, - 2.507328748703003, - 2.507328748703003, - 2.507328748703003 - ], - "DrainDuration": 4.010584692005068, - "Sent": 119800, - "Recieve": 119800, + 2.241762399673462, + 1.7462072372436524, + 2.280869483947754, + 2.311460494995117, + 2.311460494995117, + 2.311460494995117 + ], + "DrainDuration": 3.7998242970061257, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.250264046727475, - 1.9659753871100172, - 2.418292886972795, - 2.5073288794703876, - 2.5073288794703876, - 2.5073288794703876 + 2.241762516590482, + 1.7390507417041388, + 2.2808696029043675, + 2.311460615547176, + 2.311460615547176, + 2.311460615547176 ] }, "bridgenet2": { "Framerate": [ 60, - 55, + 60, 60, 60, 60, 60 ], "Bandwidth": [ - 145.30645751953126, - 86.84367370605469, - 145.8762969970703, - 145.9589385986328, - 145.9589385986328, - 145.9589385986328 - ], - "DrainDuration": 10.68330016300024, - "Sent": 98800, - "Recieve": 98800, + 144.8165740966797, + 114.40079498291016, + 144.9199981689453, + 144.95138549804688, + 145.18226623535157, + 145.18226623535157 + ], + "DrainDuration": 11.432884189998731, + "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 145.30646509785357, - 95.13330211097316, - 145.87630460511208, - 145.95894621098467, - 145.95894621098467, - 145.95894621098467 + 144.8165816494526, + 114.40080094937656, + 144.9200057271122, + 144.95139305785075, + 145.1822738071968, + 145.1822738071968 ] }, "netray_compile": { @@ -1383,84 +1650,120 @@ 60 ], "Bandwidth": [ - 2.3817059993743898, - 1.874155879020691, - 2.411635160446167, - 2.4140243530273439, - 2.4336061477661135, - 2.4336061477661135 - ], - "DrainDuration": 3.7315073780046079, - "Sent": 120000, + 2.37839412689209, + 1.7392919063568116, + 2.423856735229492, + 2.4351439476013185, + 2.451141119003296, + 2.451141119003296 + ], + "DrainDuration": 3.733749546998297, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.381706123590037, - 1.874155976765537, - 2.411635286222742, - 2.414024478928525, - 2.4336062746885647, - 2.4336062746885647 + 2.37839425093501, + 1.7392919970679533, + 2.423856861643472, + 2.435144074603972, + 2.451141246840267, + 2.451141246840267 ] }, - "bytenet": { + "zap": { "Framerate": [ - 61, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 2.3101882934570314, - 1.8508734703063965, - 2.3256075382232668, - 2.327732563018799, - 2.327732563018799, - 2.327732563018799 - ], - "DrainDuration": 3.733247598996968, - "Sent": 120000, + 2.3771073818206789, + 1.826068639755249, + 2.4150452613830568, + 2.4232165813446047, + 2.426578998565674, + 2.426578998565674 + ], + "DrainDuration": 3.732387935000588, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.309021116518579, - 1.8508735668369703, - 2.3256076595131516, - 2.3277326844195125, - 2.3277326844195125, - 2.3277326844195125 + 2.3771075057964898, + 1.82606873499215, + 2.415045387337482, + 2.4232167077251978, + 2.4265791251216308, + 2.4265791251216308 ] }, "roblox": { "Framerate": [ 60, 60, - 61, + 60, 61, 61, 61 ], "Bandwidth": [ - 232.29190063476563, - 228.8047637939453, - 235.5247802734375, - 235.59292602539063, - 235.59292602539063, - 235.59292602539063 - ], - "DrainDuration": 8.382915554990177, - "Sent": 120000, + 233.7328643798828, + 229.4481658935547, + 234.47068786621095, + 235.19984436035157, + 235.19984436035157, + 235.19984436035157 + ], + "DrainDuration": 10.316508645002614, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 232.29191274973233, - 228.80477572704366, - 235.524792557012, - 235.5929383125192, - 235.5929383125192, - 235.5929383125192 + 233.73287657000163, + 229.44817786020907, + 234.47070009481025, + 235.19985662697935, + 235.19985662697935, + 235.19985662697935 ] }, "satset": { + "DrainDuration": 3.698995181999635, + "DebugStats": { + "reliableCommitBytes": 241602, + "commitGcKb": 0, + "unreliableCommits": 0, + "receiveDecodeGcKb": 0, + "commitGcSamples": 601, + "reliableCommits": 601, + "packetDecodeGcKb": 0, + "listenerCallGcSamples": 0, + "packetDecodeGcSamples": 0, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 120200, + "sendGcSamples": 240400, + "listenerDispatchGcKb": 0, + "listenerDispatchGcSamples": 0, + "adapterGcKb": 7792, + "sendGcKb": 1, + "unreliableCommitBytes": 0, + "listenerCallGcKb": 0, + "receiveDecodeGcSamples": 0 + }, + "Sent": 120200, + "Frames": 601, + "NormalizedBandwidth": [ + 2.382770424182654, + 1.8550478677193945, + 2.4348571714693225, + 2.4499806251366698, + 2.4499806251366698, + 2.4499806251366698 + ], "Framerate": [ 60, 60, @@ -1470,84 +1773,98 @@ 61 ], "Bandwidth": [ - 2.3600337505340578, - 1.8788734674453736, - 2.4089317321777345, - 2.423952341079712, - 2.423952341079712, - 2.423952341079712 - ], - "DrainDuration": 3.748035296011949, - "Sent": 120000, - "Recieve": 120000, - "NormalizedBandwidth": [ - 2.3600338736194095, - 1.878873565436261, - 2.4089318578133147, - 2.423952467498678, - 2.423952467498678, - 2.423952467498678 - ] + 2.382770299911499, + 1.8473504781723023, + 2.4247539043426515, + 2.4499804973602297, + 2.4499804973602297, + 2.4499804973602297 + ], + "ServerDebugStats": { + "reliableCommitBytes": 0, + "commitGcKb": 0, + "unreliableCommits": 0, + "listenerDispatchGcSamples": 0, + "commitGcSamples": 0, + "reliableCommits": 0, + "packetDecodeGcKb": 8023, + "listenerCallGcSamples": 120200, + "packetDecodeGcSamples": 120200, + "streamGrowths": 0, + "streamGrowthBytes": 0, + "adapterGcSamples": 0, + "sendGcSamples": 0, + "listenerDispatchGcKb": 0, + "listenerCallGcKb": -1127, + "adapterGcKb": 0, + "sendGcKb": 0, + "unreliableCommitBytes": 0, + "receiveDecodeGcSamples": 120801, + "receiveDecodeGcKb": 0 + }, + "Recieve": 120200 }, - "packet": { + "bytenet": { "Framerate": [ 60, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 2.2492129802703859, - 1.8232378959655762, - 2.2864480018615724, - 2.3006608486175539, - 2.3006608486175539, - 2.3006608486175539 - ], - "DrainDuration": 3.7495955190097449, - "Sent": 120000, + 2.3558192253112795, + 1.8665226697921754, + 2.3975536823272707, + 2.4173099994659426, + 2.4335269927978517, + 2.4335269927978517 + ], + "DrainDuration": 3.750927599001443, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.249213097575984, - 1.8157657050413503, - 2.286448121109128, - 2.3006609686063674, - 2.3006609686063674, - 2.3006609686063674 + 2.3558193481768265, + 1.8665227671389185, + 2.397553807369439, + 2.4173101255384834, + 2.4335271197161747, + 2.4335271197161747 ] }, - "blink": { + "packet": { "Framerate": [ 60, 60, - 61, - 61, - 61, - 61 + 60, + 60, + 60, + 60 ], "Bandwidth": [ - 2.4459776878356935, - 1.9182907342910767, - 2.4515068531036379, - 2.479783296585083, - 2.479783296585083, - 2.479783296585083 - ], - "DrainDuration": 3.817761062993668, - "Sent": 120000, + 2.312589645385742, + 1.8398791551589966, + 2.3718972206115724, + 2.4044816493988039, + 2.433119058609009, + 2.433119058609009 + ], + "DrainDuration": 3.750964612001553, "Recieve": 120000, + "Sent": 120000, + "Frames": 600, "NormalizedBandwidth": [ - 2.437858547605591, - 1.9182908343377348, - 2.4580825298049859, - 2.47978342591586, - 2.47978342591586, - 2.47978342591586 + 2.312589765996691, + 1.8398792511161722, + 2.371897344315652, + 2.404481774802294, + 2.4331191855060565, + 2.4331191855060565 ] }, - "zap": { + "blink": { "Framerate": [ 60, 60, @@ -1557,23 +1874,24 @@ 60 ], "Bandwidth": [ - 2.3627519607543947, - 1.885648488998413, - 2.3907129764556886, - 2.397568941116333, - 2.4187347888946535, - 2.4187347888946535 - ], - "DrainDuration": 3.6999580029951177, - "Sent": 120000, - "Recieve": 120000, + 2.390836715698242, + 1.910537838935852, + 2.447601795196533, + 2.464641571044922, + 2.487464189529419, + 2.487464189529419 + ], + "DrainDuration": 3.683417451000423, + "Recieve": 120200, + "Sent": 120200, + "Frames": 601, "NormalizedBandwidth": [ - 2.362752083981512, - 1.8856485873426455, - 2.3907131011410867, - 2.3975690661592976, - 2.4187349150415029, - 2.4187349150415029 + 2.3908368403900939, + 1.9105379385781652, + 2.4476019228489145, + 2.4646416995859967, + 2.487464319260786, + 2.487464319260786 ] } } diff --git a/benchmark/satset-benchmark.rbxl b/benchmark/satset-benchmark.rbxl new file mode 100644 index 0000000000000000000000000000000000000000..72ec6a5d74d0a829c9e35f7073eabe8a4ddd3609 GIT binary patch literal 337016 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�M< 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℞K=YSyC6M%i+%m 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

)$QD0~3!o^0g31>ck2 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 1 then local actualKbps = Stats.DataSendKbps @@ -189,13 +206,28 @@ local function runBenchmark(tool: string, bench: string): Benchmark table.insert(frameratePercentiles, percentile(framerates, pct)) end - return { + local result: Benchmark = { Sent = sent, Recieve = 0, Bandwidth = bandwidthPercentiles, NormalizedBandwidth = normalizedBandwidthPercentiles, Framerate = frameratePercentiles, + Frames = totalFrames, } + + if lowerTool == "satset" then + local debugStats = SatsetBatcher.getDebugStats() + assertSplitDebugStats(debugStats, "Client SatsetBatcher") + result.DebugStats = debugStats + + if BenchmarkConfig.activeMode == "latency" and debugStats.reliableCommits > totalFrames + 2 then + error( + `[Satset Benchmark] reliableThreshold = 0 produced {debugStats.reliableCommits} reliable commits across {totalFrames} frames` + ) + end + end + + return result end local function runAll() @@ -203,6 +235,12 @@ local function runAll() Modes = require(ReplicatedStorage.Shared.modes) local results: Results = {} + assertSplitDebugStats(SatsetBatcher.getDebugStats(), "Client SatsetBatcher") + assertSplitDebugStats( + ReplicatedStorage.Shared.GetRecieved:InvokeServer("getSatsetDebugStats"), + "Server SatsetBatcher" + ) + print("Measuring baseline bandwidth...") local baselineKbps = measureBaseline(5) print(`Baseline DataSendKbps: {baselineKbps}`) @@ -216,6 +254,24 @@ local function runAll() results[bench][tool] = runBenchmark(tool, bench) local drainDuration = waitForDrain(baselineKbps) results[bench][tool].DrainDuration = drainDuration + + if string.lower(tool) == "satset" then + local debugStats = SatsetBatcher.getDebugStats() + assertSplitDebugStats(debugStats, "Client SatsetBatcher") + results[bench][tool].DebugStats = debugStats + if + BenchmarkConfig.activeMode == "latency" + and debugStats.reliableCommits > (results[bench][tool].Frames or 0) + 2 + then + error( + `[Satset Benchmark] reliableThreshold = 0 produced {debugStats.reliableCommits} reliable commits across {results[bench][tool].Frames or 0} frames` + ) + end + + local serverDebugStats = ReplicatedStorage.Shared.GetRecieved:InvokeServer("getSatsetDebugStats") + assertSplitDebugStats(serverDebugStats, "Server SatsetBatcher") + results[bench][tool].ServerDebugStats = serverDebugStats + end end waitForDrain(baselineKbps) diff --git a/benchmark/src/server/init.server.luau b/benchmark/src/server/init.server.luau index e599188..471be55 100644 --- a/benchmark/src/server/init.server.luau +++ b/benchmark/src/server/init.server.luau @@ -1,13 +1,13 @@ -- Benchmark server. Receives data from all modes and validates correctness. local ReplicatedStorage = game:GetService("ReplicatedStorage") +local BenchmarkConfig = require(ReplicatedStorage.Shared.BenchmarkConfig) local Satset = require(ReplicatedStorage.references.Satset) +local SatsetBatcher = require(ReplicatedStorage.references.Satset.Core.Batcher) Satset.start({ - batching = { - reliableThreshold = 60000, - maxPacketsPerFrame = 20, - }, + batching = BenchmarkConfig.batching, }) +SatsetBatcher.setDebugGcEnabled(true) local Benches = require(game:GetService("ReplicatedStorage").Shared.benches) local Modes = require(ReplicatedStorage.Shared.modes) @@ -111,7 +111,14 @@ for name, data in Benches do end -- Client pulls received counts to compute packet loss. -ReplicatedStorage.Shared.GetRecieved.OnServerInvoke = function() +ReplicatedStorage.Shared.GetRecieved.OnServerInvoke = function(_player, action: string?) + if action == "resetSatsetDebugStats" then + SatsetBatcher.resetDebugStats() + return true + elseif action == "getSatsetDebugStats" then + return SatsetBatcher.getDebugStats() + end + return received end diff --git a/benchmark/src/shared/BenchmarkConfig.luau b/benchmark/src/shared/BenchmarkConfig.luau new file mode 100644 index 0000000..633e08b --- /dev/null +++ b/benchmark/src/shared/BenchmarkConfig.luau @@ -0,0 +1,24 @@ +-- Select which Satset batching profile the benchmark runner uses. +-- Change activeMode to "latency" when regenerating latency-mode-result.json. +local activeMode = "default" + +local modes = { + default = { + batching = { + reliableThreshold = 60000, + maxPacketsPerFrame = 20, + }, + }, + latency = { + batching = { + reliableThreshold = 0, + maxPacketsPerFrame = 0, + }, + }, +} + +return { + activeMode = activeMode, + batching = modes[activeMode].batching, + modes = modes, +} diff --git a/benchmark/src/shared/modes/bridgenet2.luau b/benchmark/src/shared/modes/bridgenet2.luau index d8c1492..62f00ff 100644 --- a/benchmark/src/shared/modes/bridgenet2.luau +++ b/benchmark/src/shared/modes/bridgenet2.luau @@ -1,6 +1,6 @@ -- BridgeNet2 benchmark mode (v1.0.0 API). -- BridgeNet2 uses ReferenceBridge with string identifiers. -local BridgeNet2 = require(game:GetService("ReplicatedStorage").DevPackages.bridgenet2) +local BridgeNet2 = require(game:GetService("ReplicatedStorage").DevPackages.BridgeNet2) local Benches = require(game:GetService("ReplicatedStorage").Shared.benches) diff --git a/benchmark/src/shared/modes/bytenet.luau b/benchmark/src/shared/modes/bytenet.luau index 3693282..d8810f2 100644 --- a/benchmark/src/shared/modes/bytenet.luau +++ b/benchmark/src/shared/modes/bytenet.luau @@ -1,5 +1,5 @@ -- ByteNet benchmark mode (v0.4.6 API). -local ByteNet = require(game:GetService("ReplicatedStorage").DevPackages.bytenet) +local ByteNet = require(game:GetService("ReplicatedStorage").DevPackages.ByteNet) -- ByteNet 0.4.6 requires the schema to be in the 'value' field. return ByteNet.defineNamespace("Benchmark", function() diff --git a/benchmark/src/shared/modes/satset.luau b/benchmark/src/shared/modes/satset.luau index 56d085d..ad14044 100644 --- a/benchmark/src/shared/modes/satset.luau +++ b/benchmark/src/shared/modes/satset.luau @@ -1,6 +1,7 @@ -- Satset benchmark mode. local RunService = game:GetService("RunService") local Satset = require(game:GetService("ReplicatedStorage").references.Satset) +local SatsetBatcher = require(game:GetService("ReplicatedStorage").references.Satset.Core.Batcher) local Types = Satset.Types -- We don't call Satset.start() here anymore. @@ -81,12 +82,14 @@ for name, packet: any in Packets do Wrapped[name] = { fire = function(data: any) if RunService:IsClient() then + local gcStart = SatsetBatcher.beginDebugGc() local isWrapped = (type(data) == "table" and data[1] ~= nil) or type(data) == "number" + local payload = data if isWrapped then - packet:fireServer({ value = data }) - else - packet:fireServer(data) + payload = { value = data } end + SatsetBatcher.recordDebugGc("adapter", gcStart) + packet:fireServer(payload) end end, listen = function(callback: any) diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..477e7af4c100cbb4a0e598b9e4ca0196ef450e8c GIT binary patch literal 6148 zcmeHKO;6k~5FPIaWQ8j2p_RBGMdFIuErm*`m$1NrD?#m{t+q)M(Wq&>+GN?oYNedv z$8hDB@OR*iZBSE6kA+q<(fEzWGfw;x*%=~I!)fxGs82*5l(E%A^BduD)_c-&o-R=F z9QtdV>li(rPUK%;fZtu4A{tY6m^a?vE=FEn8!-!6LR5(>rHaa5VlVy_8_&wI`z|iy zah{dcU~r{c?M`=T*<1EjywBk`JqxR-nwG<8@{xPTTIcbt9mVgnbT;Zg-_u1EWkotM z30aaNS&n>!o+*7nw7!=LYL4q(4|yIAzR7wfOy z9gV){KMH+jR!9n8v5{vEZ{Zw9WBsS$q{ww~0zc<;>4c_~Q9@~x8MTJdpIJm#L>LeT zgn>tA!0mS4%A-GtJb*AD3_LXkcz^JrjDf@2qS-pom=XZkf!hdd^Yah%*#Qh3))wJ` zD4PnjsmhfY%GD0arei#C@wG*pPRiUF^SC=JSD`3ZdMMw7lL{WLh6ZVbfxpVY4KWvOwEzGB literal 0 HcmV?d00001 diff --git a/docs/api/channel.md b/docs/api/channel.md index a408636..70d8300 100644 --- a/docs/api/channel.md +++ b/docs/api/channel.md @@ -15,7 +15,7 @@ type ChannelConfig = { > [!IMPORTANT] > Channels only support **fixed-size types**. This allows the engine to pre-compute buffer offsets and perform zero-allocation updates. -> There is a limit of **32 fields** per channel. This is a technical constraint of the 32-bit dirty bitmask tracking used to keep delta updates O(1) and extremely compact. +> There is a limit of **32 fields** per channel. This is a technical constraint of the 32-bit dirty bitmask tracking used to keep delta updates O(1) and compact. ## Methods (Channel Object) diff --git a/docs/api/packet.md b/docs/api/packet.md index f248c19..5b2014f 100644 --- a/docs/api/packet.md +++ b/docs/api/packet.md @@ -18,7 +18,7 @@ Objects returned by `Satset.definePacket`. ### `:listen(callback: (data: table, sender: Player?) -> ())` -Registers a listener for the packet. Listeners are wrapped in `xpcall` internally, so an error in one listener will not prevent other listeners from running or crash the library. Errors are reported to the output via `warn`. +Registers a listener for the packet. Listener calls are wrapped in `pcall`, so an error in one listener does not prevent later listeners from running. Errors are reported through `warn`. - **data**: The decoded payload. - **sender**: The player who sent the packet (Server only). diff --git a/docs/api/satset.md b/docs/api/satset.md index 1ed8c42..f7755d1 100644 --- a/docs/api/satset.md +++ b/docs/api/satset.md @@ -6,13 +6,14 @@ The main entry point for the library. ### `Satset.start(config: SatsetConfig?)` -Initializes the networking engine. Must be called once on both server and client. Calling it more than once is safe — subsequent calls are ignored with a warning. +Initializes the networking engine. Must be called once on both server and client. Calling it more than once is safe; later calls are ignored with a warning. - **config**: Optional configuration object. - **guard**: Guard configuration (see [Guard API](./guard.md)). - **batching**: Batching behavior. - - **reliableThreshold**: (number) Size in bytes before a reliable payload is segmented. Default is `60000`. Set to `0` to disable segmentation for lower latency. - - **maxPacketsPerFrame**: (number) Maximum number of packets to process per frame. Default is `0` (unlimited). + - **reliableThreshold**: (number) Size in bytes before a reliable stream is committed and a new stream begins. Default is `60000`. Set to `0` to disable threshold splitting; reliable packets are committed at the frame flush. + - **unreliableThreshold**: (number) Size in bytes before an unreliable stream is committed and a new stream begins. Default is `900`. + - **maxPacketsPerFrame**: (number) Maximum committed batches sent per frame for each queue. Default is `0` (no cap). ### `Satset.definePacket(config: PacketConfig): Packet` @@ -55,7 +56,7 @@ Reference to the [Types module](./types.md). ## Performance Context -Initialization and packet definitions are O(1) operations. For details on how Satset's hybrid engine performs under extreme network load, see the [Benchmarks Report](../../benchmark/Benchmarks.md). +Initialization and packet definitions are O(1) operations. For benchmark results under heavy local Studio load, see the [Benchmarks Report](../../benchmark/Benchmarks.md). ## Related Guides diff --git a/docs/api/types.md b/docs/api/types.md index c7d8c94..d509454 100644 --- a/docs/api/types.md +++ b/docs/api/types.md @@ -34,7 +34,7 @@ Standard and optimized types for schemas. - `optional(type)`: Nullable type. Adds a **1-byte header** (a `u8` boolean flag) to check for `nil`. - `array(type)`: Array of a specific type. Includes a **2-byte header** (a `u16` integer) for length (max 65,535 elements) followed by the array elements. -- `map(keyType, valType)`: Dictionary mapping. Includes a **2-byte header** (a `u16` integer) for element count. Keys are sorted alphabetically during serialization to ensure deterministic byte order output. +- `map(keyType, valType)`: Dictionary mapping. Includes a **2-byte header** (a `u16` integer) for element count. Keys are sorted alphabetically during serialization to produce deterministic byte order output. - `enum(values: {string})`: Efficient mapping. Converts string constants into a **single 1-byte `u8` index** corresponding to its array position. ## Specialized diff --git a/docs/guide/architecture.md b/docs/guide/architecture.md index 0bd51c3..7c6b07e 100644 --- a/docs/guide/architecture.md +++ b/docs/guide/architecture.md @@ -32,23 +32,21 @@ sequenceDiagram participant SN as Sanitizer Dev->>PK: fireServer(data) - PK->>SR: encode(compiledSchema, data) + PK->>SR: calculateSize(compiledSchema, data) SR->>SC: uses field order and offsets - SR->>SR: calculateSize(compiledSchema, data) - SR->>SR: encodeInto(buffer, offset) - SR-->>PK: returns payload buffer - - PK->>BT: enqueue(packetId, payload, reliable) + PK->>BT: allocateForServer(packetId, size, reliable) + BT-->>PK: buffer, offset + PK->>SR: encodeInto(compiledSchema, data, buffer, offset) Note over BT: PostSimulation fires once per frame - BT->>BT: encodeBatch(queue) - opt payload > reliableThreshold - BT->>BT: segment(payload) + BT->>BT: commitStream(queue) + opt reliableThreshold > 0 and stream exceeds threshold + BT->>BT: commit current buffer and start a new one end - Note right of BT: Wire: [u8 count][u8 id, (opt u16 size), payload]... + Note right of BT: Wire: [u16 count][u8 id, (opt u16 size), payload]... BT->>BR: getReliable() - BR->>RE: FireServer(segments[]) + BR->>RE: FireServer(batchBuffer) Note over RE: Crosses the network boundary @@ -56,16 +54,15 @@ sequenceDiagram GD->>GD: consume(player) via token bucket alt Token available GD->>PK: _dispatch(batchBuffer, player) - PK->>BT: decodeBatch(batchBuffer) - BT-->>PK: entries[] + PK->>BT: processBatch(batchBuffer, player, _dispatchSingle) loop For each entry - PK->>PK: pcall(decode) - PK->>SR: decodeFrom(compiled, buffer, offset, dispatch) - SR->>SR: uses callback-based iteration + BT->>PK: dispatch(packetId, buffer, payloadOffset, sender) + PK->>PK: pcall(decodeToTable) + PK->>SR: decodeToTable(compiled, buffer, offset) SR->>SN: sanitizeFloat(value) for each number field SR->>SN: checkBounds(buffer, cursor, size) - SR-->>PK: invokes dispatch(...) callback - PK->>Dev: listener(data, sender) + SR-->>PK: decoded data table + PK->>Dev: listener(data, sender) via pcall Note over PK: data table constructed only if listeners exist end else Token exhausted @@ -76,7 +73,7 @@ sequenceDiagram ### Wire Format (Reliable Batch) ```luau -[u8 packetCount] +[u16 packetCount] [u8 packetId][u16 payloadSize][...payload bytes] (Variable size) [u8 packetId][...payload bytes] (Fixed size - size header omitted) ... @@ -87,7 +84,7 @@ sequenceDiagram Unreliable batches include a sequence number for stale packet detection. If the batch exceeds 900 bytes (MTU limit), it is automatically split into multiple sub-batches, each with its own sequence number. ```luau -[u16 sequenceNumber][u8 packetCount] +[u16 sequenceNumber][u16 packetCount] [u8 packetId][u16 payloadSize][...payload bytes] (Variable) [u8 packetId][...payload bytes] (Fixed) ... @@ -157,38 +154,38 @@ Channels periodically send a full keyframe to prevent client-side state drift ca Satset processes incoming data through a strict validation stack before it reaches the developer's listener: -1. **OOB Shielding (`pcall`)**: All packet decoding runs inside a protected call. If a malicious payload forces a read past the end of the buffer, the VM throws an error that is immediately caught and silenced. -2. **Allocation Capping (`table.create`)**: Variable-length types (arrays, strings, maps) mathematically limit their allocations based on the remaining bytes in the payload. This prevents exploiters from crashing the server with massive GC spikes. +1. **OOB Shielding (`pcall`)**: Packet decoding runs inside a protected call. If a malicious payload forces a read past the end of the buffer, the VM throws an error that is caught and silenced. +2. **Allocation Capping (`table.create`)**: Variable-length types (arrays, strings, maps) limit their allocations based on the remaining bytes in the payload. This prevents memory exhaustion and large GC spikes. 3. **Float Sanitization (`Sanitizer.sanitizeFloat`)**: All floating-point fields (`f32`, `f64`, `Vector3`, etc.) are clamped to prevent `NaN` and `Infinity` from propagating into game logic. 4. **Schema Verification (`Sanitizer.checkBounds`)**: For fixed-size schema fields, the serializer checks that enough bytes remain before executing the read. ## Batching Strategies -Satset's batching engine can be configured to balance between raw networking performance and engine stability. This is controlled via the `batching` table in `Satset.start()`. +Satset's batching engine is configured through the `batching` table in `Satset.start()`. -### Stability Mode (Default) +### Default Runtime Settings -Optimized for consistent engine frame-times and reliable delivery of large data chunks. +The default runtime settings split reliable streams above 60 KB and send every ready batch during the frame flush. ```luau batching = { - reliableThreshold = 60000, -- Segmentation at 60KB - maxPacketsPerFrame = 0 -- No rate limiting (default) + reliableThreshold = 60000, -- Split reliable batches above 60 KB + maxPacketsPerFrame = 0, -- Send all ready batches each frame } ``` -> In this mode, Satset segments large payloads to stay within Roblox's internal buffer > limits, preventing "packet too large" errors and ensuring the engine can process network ?traffic smoothly. +`maxPacketsPerFrame` caps how many committed batches each queue can send in one frame. A value of `0` means no cap. -### Latency Mode +### One-Commit Profile -Optimized for minimum overhead and maximum throughput. Recommended for competitive games with small, frequent updates. +Setting `reliableThreshold` to `0` disables threshold splitting for reliable streams. Queued reliable packets are committed once at the frame flush. ```luau batching = { - reliableThreshold = 0, -- Bypass segmentation - maxPacketsPerFrame = 0 + reliableThreshold = 0, -- Disable threshold splitting + maxPacketsPerFrame = 0, } ``` ->[!NOTE] ->By setting `reliableThreshold` to 0, Satset sends payloads as a single segment. This reduces protocol overhead and allows the engine's underlying [Zstd](https://github.com/facebook/zstd) compression to work much more efficiently, often resulting in significantly lower bandwidth usage in benchmarks. +> [!NOTE] +> The current benchmark latency profile uses this setting. It reduces commit count for large homogeneous payloads, which reduces measured `Stats.DataSendKbps` in the benchmark. It also allows larger `RemoteEvent` payloads, so test it with real game payloads before use. diff --git a/docs/guide/development-patterns.md b/docs/guide/development-patterns.md index 67817d2..aa95572 100644 --- a/docs/guide/development-patterns.md +++ b/docs/guide/development-patterns.md @@ -1,19 +1,19 @@ # Development Patterns -Satset follows strict performance and safety constraints. These patterns ensure the library stays efficient under high-throughput conditions. +Satset follows strict performance and safety constraints. These patterns keep the library predictable under high-throughput conditions. -## Zero-allocation hot path +## Allocation-aware hot path -Allocations during the sync cycle are prohibited. Satset uses native Luau `buffer` operations for all throughput to avoid garbage collection (GC) overhead. +The send path avoids per-packet queue tables. Satset writes payloads directly into Luau `buffer` streams and commits exact-size buffers at flush time. -* **The Problem**: Table and string allocations trigger GC pauses. When syncing hundreds of entities, these pauses cause frame drops. -* **The Pattern**: Reuse pre-allocated buffers. Avoid creating tables or strings during encoding and decoding. +* **The Problem**: Table and string allocations can trigger GC pauses. When syncing hundreds of entities, those pauses can reduce frame rate. +* **The Pattern**: Reuse working buffers on the send path. Decode into tables only at the public API boundary, where packet listeners and channel subscribers receive Lua values. ## Deterministic byte alignment Satset doesn't transmit type metadata or field names. Server and client must share an identical understanding of the buffer layout. -* **The Pattern**: `SchemaCompiler` sorts field definitions alphabetically before calculating memory offsets. This guarantees that different environments produce the same binary schema, regardless of how the Luau table is ordered. +* **The Pattern**: `SchemaCompiler` sorts field definitions alphabetically before calculating memory offsets. This produces the same binary schema across environments, regardless of how the Luau table is ordered. ## Mandatory input sanitization @@ -32,7 +32,7 @@ Choose data types based on bit-density. State sync is an explicit, bitmask-tracked process, not an automatic "magic" sync. -* **The Pattern**: `Channels` track modified fields using a 32-bit mask. Only dirty fields are sent. Syncing happens during `PostSimulation` to maximize batching efficiency. +* **The Pattern**: `Channels` track modified fields using a 32-bit mask. Only dirty fields are sent. Syncing happens during `PostSimulation`, the same frame phase used by packet batching. ## Defensive buffer reads @@ -53,7 +53,7 @@ Satset uses a specific naming convention to maintain code clarity across the lib ## Change checklist -When you modify any part of Satset, use this checklist to make sure nothing falls out of sync. Not every change touches every item, but you should actively consider each one. +When you modify any part of Satset, use this checklist to make sure related docs and examples stay in sync. Not every change touches every item. ### If you change a public API method or add a new one diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index 4bce1ed..3bde5ba 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -16,8 +16,8 @@ Satset.start({ studioBypass = true -- Enabled by default }, batching = { - reliableThreshold = 60000, -- Segmentation for stability - maxPacketsPerFrame = 0 -- No frame-spreading + reliableThreshold = 60000, -- Split reliable batches above 60 KB + maxPacketsPerFrame = 0, -- Send all ready batches each frame } }) ``` diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 4359aa3..01b8adf 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -24,4 +24,4 @@ wally install ## Rojo -If you are using Rojo, you can simply sync the `src/` folder into your project under `ReplicatedStorage.Packages.Satset`. +If you are using Rojo, sync the `src/` folder into your project under `ReplicatedStorage.Packages.Satset`. diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md index 0852cba..c4d71d2 100644 --- a/docs/guide/introduction.md +++ b/docs/guide/introduction.md @@ -1,17 +1,17 @@ # Introduction -**Satset** is a high-performance, buffer-backed hybrid networking library for Roblox. It is designed to be the fastest and most efficient way to synchronize data between the server and clients, combining the best patterns from community leaders like [Blink](https://github.com/1Axen/blink), [Zap](https://github.com/red-blox/zap), [ByteNet](https://github.com/ffrostfall/ByteNet), [Warp](https://github.com/imezx/Warp), [BridgeNet2](https://github.com/ffrostfall/BridgeNet2), [Packet](https://devforum.roblox.com/t/packet-networking-library/3573907/1), and [Red](https://github.com/red-blox/Red). +**Satset** is a buffer-backed hybrid networking library for Roblox. It provides stateless packets, stateful channels, schema-based serialization, and server-side rate limiting. ## Why Satset? -Roblox's native `RemoteEvent` system is powerful but can be inefficient for high-frequency data (like character positions or combat state). Satset solves this by: +Roblox's native `RemoteEvent` system can become expensive for high-frequency data such as character positions or combat state. Satset handles this with: -- **Buffer-backed serialization**: Uses Luau `buffer` for zero-allocation, tightly packed data. -- **Automatic batching**: Combines multiple packet fires into a single remote call per frame. +- **Buffer-backed serialization**: Uses Luau `buffer` for compact binary payloads. +- **Automatic batching**: Queues packet fires and commits them during `PostSimulation`. - **Stateful Channels**: Efficiently synchronizes state changes using bitmask-based delta compression. -- **Security-first**: Built-in rate limiting (Guard) and data sanitization. -- **Developer Experience**: Simple, type-safe API that doesn't require a complex build step for most use cases. +- **Guard and sanitization**: Applies server-side token buckets, buffer bounds checks, and float sanitization. +- **Plain Luau API**: Works without a code generation step. ## "Sat set, sampai." -The name comes from Indonesian slang meaning "quick and efficient." Our goal is to get your data from A to B as fast and reliably as possible, with no overhead. +The name comes from Indonesian slang meaning "quick and efficient." Satset aims to reduce per-event overhead while keeping the API direct. diff --git a/docs/guide/packets.md b/docs/guide/packets.md index e7c8afe..8e13df2 100644 --- a/docs/guide/packets.md +++ b/docs/guide/packets.md @@ -1,12 +1,12 @@ # Packets -Packets are the primary way to send data in Satset. They are designed for **stateless** communication—you send a piece of data, and the receiver handles it. +Packets are the primary way to send data in Satset. They are designed for **stateless** communication: you send a piece of data, and the receiver handles it. ## Automatic Batching -One of Satset's core strengths is automatic batching. When you call `:fireServer()` or `:fireClient()`, the data isn't sent immediately. Instead, Satset waits until the end of the frame, combines all outgoing packets into a single buffer, and sends them in one go. +When you call `:fireServer()` or `:fireClient()`, Satset queues the encoded payload instead of sending it immediately. During `PostSimulation`, each queue is committed to one or more buffers and sent through the matching remote. -This drastically reduces the overhead caused by Roblox's internal `RemoteEvent` overhead. +Reliable batches split at `reliableThreshold`. Unreliable batches split around 900 bytes by default. Fixed-size packet schemas omit payload-size headers. ## Reliability @@ -18,7 +18,7 @@ local PositionUpdate = Satset.definePacket({ schema = { pos = Types.Vector3, }, - reliable = false -- Use UnreliableRemoteEvent + reliable = false, -- Use UnreliableRemoteEvent }) ``` diff --git a/docs/guide/security.md b/docs/guide/security.md index efe8cf6..8dc6096 100644 --- a/docs/guide/security.md +++ b/docs/guide/security.md @@ -1,6 +1,6 @@ # Security -Satset was built with production security in mind. It includes multiple layers of protection to keep your server safe from malicious clients. +Satset treats incoming network data as untrusted. The server validates payloads before game code receives them. ## The Guard @@ -28,19 +28,19 @@ When a player exceeds their limit, the Guard drops the packet silently. We do no We treat all incoming client data as hostile. If an exploiter sends a corrupted or spoofed packet, the server must not crash or lag. -- **OOB Shielding**: We wrap all packet decoding in a `pcall`. If a malicious client truncates a buffer to force an out-of-bounds read, the operation fails silently. The server drops the packet without printing stack traces to the console. +- **OOB Shielding**: We wrap packet decoding in a `pcall`. If a malicious client truncates a buffer to force an out-of-bounds read, the operation fails silently. The server drops the packet without printing stack traces to the console. - **Allocation Capping**: When reading variable-length types like arrays or strings, we cap the `table.create` allocation to the actual remaining bytes in the buffer. If an exploiter sends a 4-byte payload claiming to contain 65,000 elements, Satset limits the array size to match the buffer. This stops memory exhaustion and garbage collector spikes. - **Float Sanitization**: We clamp `NaN` and `±Infinity` to `0` when reading or writing floating-point numbers (`f32`, `f64`, `Vector3`). This prevents corrupted math from infecting the server state. ## Listener Protection -All user-registered callbacks (both `Packet:listen` and `Channel:subscribe`) are wrapped in `xpcall`. If your callback throws an error, it will: +User-registered callbacks are protected before Satset calls them. `Packet:listen` uses `pcall`; `Channel:subscribe` uses `xpcall`. If your callback throws an error, Satset: -1. Be caught and reported via `warn` with the packet/channel name and the error message. -2. Not affect any other listeners registered on the same packet or channel. -3. Not halt the library's internal dispatch loop. +1. Catches it and reports it via `warn` with the packet or channel name and the error message. +2. Continues running other listeners registered on the same packet or channel. +3. Continues the internal dispatch loop. -This prevents a single broken game script from taking down the entire networking layer. +One broken game callback does not stop packet or channel dispatch. ## Stateless Design