Encodings

RustVNC supports all standard RFB protocol encodings defined in RFC 6143.

Supported Encodings

EncodingType IDDescriptionBest For
Raw0Uncompressed pixelsLAN, fallback
CopyRect1Copy screen regionsScrolling, window moves
RRE2Rise-and-Run-lengthSimple graphics
CoRRE4Compact RRESmall rectangles
Hextile516×16 tile-basedGeneral purpose
Zlib6Zlib compressionHigh compression
Tight7Multi-mode adaptiveUniversal (recommended)
ZlibHex8Zlib + HextileAlternative compression
ZRLE16Zlib Run-LengthText, UI elements
ZYWRLE17Wavelet lossyLow bandwidth
TightPng-260PNG compressionLossless quality

Tight Encoding Modes

Tight encoding automatically selects the best compression mode:

  1. Solid Fill - Single color rectangles (5 bytes)
  2. Mono Rectangle - Two-color 1-bit bitmaps
  3. Indexed Palette - 3-16 colors with palette
  4. Zlib Compressed - Lossless RGB24 compression
  5. JPEG - Lossy compression (requires turbojpeg feature)

Using rfb-encodings Directly

For custom implementations, use the encoding library directly:

use rfb_encodings::{Encoder, TightEncoder, PixelFormat};

let format = PixelFormat::rgba32();
let mut encoder = TightEncoder::new();

let encoded = encoder.encode(&pixels, width, height, &format)?;

Performance Characteristics

For a 1920×1080 full-screen update:

EncodingSizeCompression RatioCPU Usage
Raw8.3 MB1:1Minimal
CopyRect8 bytes∞:1Minimal
Hextile800 KB - 2 MB4-10:1Low
Tight JPEG100-500 KB16-83:1Medium
ZRLE400 KB - 1.5 MB5-20:1Medium
ZYWRLE150-800 KB10-55:1High

TurboJPEG Feature

Enable hardware-accelerated JPEG compression:

[dependencies]
rustvncserver = { version = "2.0", features = ["turbojpeg"] }

Requires libjpeg-turbo installed on your system:

# Ubuntu/Debian
sudo apt-get install libturbojpeg0-dev

# macOS
brew install jpeg-turbo

# Windows
# Download from https://libjpeg-turbo.org/