Skip to content

feat: compressed world maps — 84-98% smaller, ~2.8x faster, zero code changes#21

Open
web3dev1337 wants to merge 35 commits intohytopiagg:mainfrom
web3dev1337:feature/map-compression
Open

feat: compressed world maps — 84-98% smaller, ~2.8x faster, zero code changes#21
web3dev1337 wants to merge 35 commits intohytopiagg:mainfrom
web3dev1337:feature/map-compression

Conversation

@web3dev1337
Copy link
Copy Markdown

@web3dev1337 web3dev1337 commented Mar 5, 2026

Summary

TL;DR: Drop-in map compression that makes large maps ~84-98% smaller on disk, loads up to ~2.8x faster -- zero code changes required in existing games.

  • Backwards compatible: existing map.json keeps working with no changes.
  • Zero-code auto-upgrade: world.loadMap(worldMap) auto-detects compressed artifacts alongside assets/map.json and loads the fastest available format.
  • Auto-recompress: hytopia start detects when map.json is newer than compressed artifacts and recompresses automatically.
  • String path overload: world.loadMap('assets/map.json') also works -- WorldMapFileLoader handles format detection.
  • Opt-out: world.loadMap(map, { preferMapArtifacts: false }) disables auto-detection.
  • DRY CLI: scripts.js lazy-loads SDK codecs instead of duplicating compression logic.
  • Entities preserved: stored in compressed maps + chunk-cache metadata.

Zero-Code Workflow

# 1. Compress your map (one-time)
hytopia map-compress

# 2. That's it. Your existing code auto-detects the compressed files.
#    No import changes, no loadMap changes needed.
#    Edit map.json anytime -- hytopia start auto-recompresses.

Your existing code stays exactly the same:

import worldMap from './assets/map.json';
// ...
world.loadMap(worldMap);

When world.loadMap() receives a legacy WorldMap, it checks for assets/map.chunks.bin and assets/map.compressed.json. If found, it transparently loads the fastest format instead. Pass { preferMapArtifacts: false } to disable.

When hytopia start runs, it checks if map.json has been modified since the last compression. If so, it automatically recompresses before building -- no manual step needed.

CLI Command

hytopia map-compress                          # compress assets/map.json (default)
hytopia map-compress custom/world.json        # custom path
hytopia map-compress --algorithm gzip         # use gzip instead of brotli
hytopia map-compress --no-chunk-cache         # skip .chunks.bin generation
hytopia map-compress --level 11               # max brotli compression

Output files (generated alongside your map.json):

  • map.compressed.json -- 84-98% smaller, brotli-compressed varint stream
  • map.chunks.bin -- precomputed 16x16x16 chunk cache for fastest loading

Performance

Map Original Compressed Reduction
Large map (192K blocks) 3.71 MB 163 KB + 96 KB cache 95.7%
Small map (24K blocks) 650 KB 102 KB + 11 KB cache 84.3%

API Additions

  • world.loadMap(path: string) -- load map from file path with auto-detection
  • world.loadMap(map, { preferMapArtifacts }) -- opt-in/out of auto-upgrade
  • WorldMapFileLoader.load(path) -- explicit file loader (supports .json, .compressed.json, .chunks.bin)
  • WorldMapCodec -- compress/decompress WorldMap objects
  • WorldMapChunkCacheCodec -- chunk cache encode/decode
  • WorldMapArtifactsGenerator -- generate all artifacts in one call
  • hytopia map-compress -- CLI command for generating compressed artifacts
  • hytopia start -- auto-recompresses when map.json changes

Test Plan

  • Legacy map.json loads with zero code changes (PR SDK)
  • hytopia map-compress generates valid artifacts
  • Auto-detect: loadMap(worldMap) transparently uses .chunks.bin when present
  • Fallback: removing compressed artifacts falls back to legacy map.json
  • Auto-recompress: hytopia start detects stale artifacts and recompresses
  • Skip recompress: hytopia start skips when artifacts are fresh
  • Cross-map test: second game map (650K) compresses and loads correctly
  • All game systems operational with compressed map

🤖 Generated with Claude Code

web3dev1337 and others added 30 commits March 3, 2026 07:26
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Expanded server shared/types/ from one-liner to all 8 individual type files.
Expanded protocol/ from generic directory listings to every individual packet
and schema file (~50 files).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
docs: add CLAUDE.md and CODEBASE_DOCUMENTATION.md
Adds a user-facing CLI command to compress WorldMap JSON files:

  hytopia map-compress                              # default: assets/map.json
  hytopia map-compress path/to/map.json             # custom path
  hytopia map-compress --algorithm gzip --level 6   # options
  hytopia map-compress --no-chunk-cache             # skip chunk cache

Generates:
  - map.compressed.json (brotli-compressed, ~95% smaller)
  - map.chunks.bin (precomputed chunk cache, ~30% faster load)

Also includes regenerated SDK build outputs (server.mjs, server.d.ts,
docs) so the compression APIs are available at runtime.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When loadMap() receives a legacy WorldMap object, it now checks for
compressed artifacts (assets/map.chunks.bin, assets/map.compressed.json)
at the conventional location. If found, it loads the fastest format
via WorldMapFileLoader — zero code changes needed in existing games.

Also accepts a string file path for explicit control:
  world.loadMap('assets/map.json')

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When compressed artifacts exist (map.compressed.json / map.chunks.bin),
`hytopia start` checks if map.json is newer. If so, it automatically
recompresses before building — keeping artifacts in sync with zero
manual steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
web3dev1337 and others added 5 commits March 5, 2026 11:08
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…plicates

Replaced ~250 lines of duplicated compression/chunk-cache code with
lazy-loaded SDK imports (WorldMapCodec, WorldMapChunkCacheCodec,
WorldMapArtifactsGenerator). Fixed TDZ bug with _sdk declaration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@web3dev1337 web3dev1337 changed the title feat: support compressed world maps feat: compressed world maps — 84-98% smaller, ~2.8x faster, zero code changes Mar 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant