Overview
Source 2 uses several compression schemes:- Block Compression: Simple LZ-style compression for general data
- MeshOptimizer: Specialized compression for vertex and index buffers
- LZ4: Fast compression for KV3 data
- ZSTD: High compression ratio for KV3 data
BlockCompress
Provides fast decompression of block-compressed data.Namespace
CompressionInfo
Stores compression state and size information:Getting Decompressed Size
Fast Decompression
Complete Example
Compression Detection
Valve uses the high bit (0x80000000) of the size field to indicate uncompressed data:MeshOptimizer Vertex Decoder
Decodes vertex buffers compressed with meshoptimizer.Namespace
Decoding Vertex Buffers
Parameters
- vertexCount: Number of vertices to decode
- vertexSize: Size of each vertex in bytes (must be multiple of 4)
- buffer: Compressed vertex buffer data
- useSimd: Enable SIMD acceleration (default: true)
Requirements
MeshOptimizer Index Decoder
Decodes index buffers compressed with meshoptimizer.Namespace
Decoding Index Buffers
Reading Decoded Indices
Performance Considerations
SIMD Acceleration
Vertex decompression supports SIMD acceleration:Memory Efficiency
Decoders useArrayPool for temporary buffers:
Error Handling
Common Patterns
Decompressing Resource Data
Processing Mesh Data
Compression Format Details
Block Compression Algorithm
The block compression uses a simple LZ-style algorithm:- Block Mask: 16-bit mask indicating literal vs. back-reference
- Literals: Direct byte values
- Back-references: Offset and length encoding
MeshOptimizer Format
MeshOptimizer uses specialized encoding:- Vertex buffers: Delta encoding with zigzag compression
- Index buffers: Triangle strip optimization with FIFO caches
- Version headers: Format version identification
See Also
- Texture Decoders - Texture format decompression
- Compression - Advanced compression topics