Skip to content

feat(map): browse the prepared Hyrule atlas from 3DS SD storage - #2

Merged
doodlewind merged 6 commits into
mainfrom
feat/hyrule-sd-pack
Sep 8, 2026
Merged

feat(map): browse the prepared Hyrule atlas from 3DS SD storage#2
doodlewind merged 6 commits into
mainfrom
feat/hyrule-sd-pack

Conversation

@doodlewind

@doodlewind doodlewind commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Hyrule previously needed the paired Mac for every new terrain tile, even though its full atlas was already downloaded. Install a prepared SD pack so the 3DS can open Hyrule, pan and zoom through the terrain atlas without waiting for a desktop connection.

  • Bake all 21,845 terrain tiles at z0–7 into one indexed, independently compressed PICA RGB565 file (370,952,504 bytes / 353.77 MiB), with a startup metadata pack. Generated artwork and databases remain ignored.
  • Use PocketJS's createPackedImageCollection for SD reads with desktop fallback, shared demand, cancellation, prefetch and the existing 40-entry cache. Keep a separate three-read Mac queue budget so cancelled wire requests cannot expand the network backlog or block local work.
  • Keep OSM, search, bookmarks and dynamic marker labels on the Mac. The UI distinguishes SD browsing from waiting for pairing. Unsupported hosts, including PSP, retain the desktop image path.
  • Add resumable ftpd installation with full SHA-256 readback before activation, mismatch diagnostics and --restart recovery. A separate Storage Test entry compares four paired cold views and two eight-second diagonal pans; production has no automatic navigation.

README screenshots

Add three San Francisco views from the native 3DS executable running in Azahar: Union Square, the Embarcadero near the Ferry Building, and Golden Gate Park. The README embeds the actual 400×240 / 320×240 readbacks with Markdown image links. The production guest uses real OSM vector data; provenance records the camera coordinates, app/runtime commits, native binary hash and frame hashes. These are emulator captures, not physical-console photographs. Also correct the README's SD inflation and packed-image API descriptions.

Union Square in the native 3DS renderer

Physical 3DS comparison

The complete atlas and both binaries are installed with readback verification. One fixed-route run completed all ten legs, with the requested storage source and target detail level in every leg and zero native pack failures.

Measurement SD Paired Mac
Mean time to ready terrain across four guest-cache cold views 292.75 ms 1,177.50 ms
Pan callbacks with at least one target-level tile not ready 57 / 435 (13.10%) 397 / 412 (96.36%)
Pan frame callbacks per second 54.35 51.40
Pan callback intervals over 20 ms 80 114

Mean loading time fell by 75.1% (4.02× faster); individual view ratios ranged from 2.70× to 5.97×. Both paths used the same 40-entry cache and prediction policy, with annotations disabled and the Mac cache enabled. Each pan covered about 2,560 pixels at 320 px/s. The SD pan completed 63 worker reads and 61 uploads without errors.

These timings stop at resource readiness. The target-not-ready metric does not measure blank pixel area or coarser fallback coverage. Callback frequency is not GPU presentation timing, and this run does not demonstrate sustained 60 FPS. This is one run, with SD preceding Mac at each cold view; a few cancelled SD reads completed after the switches but produced no Mac-leg uploads. The connected comparison does not establish offline cold-start hardware acceptance.

The native path stores a resident 256×256 terrain tile as 128 KiB GPU RGB565 instead of 128 KiB core pixels plus 256 KiB GPU RGBA8. SD IO and inflation run on a bounded worker; guest JS makes no filesystem calls.

Procedure, results and limits · Build identities and ten measurement receipts

Validation

All 28 app tests and TypeScript; compiled Hyrule and synthetic-provider interaction replays (switching, search, saved places, delayed responses and queue/residency limits); native 3DS production and diagnostic builds; PSP guest build. Benchmark regressions cover target detail-level settlement and preservation of the warmed pan cache. Isolated installer checks covered resume, complete staging, corrupt-content rejection, restart, and a second disconnect during restart.

Every generated atlas record was decoded and CRC-checked locally. Prepared color-grid bytes matched devkitPro tex3ds 2.3.0 after applying PocketJS's vertical origin. The curated benchmark record was checked against its binary hash, commits and all ten receipts.

Builds on merged #1. Pins the validated PocketJS resource-pack commit from pocket-stack/pocketjs#381; its framework dependency stack (#377 / #381) is separate from these application merges.

@doodlewind
doodlewind changed the base branch from feat/pocket-map to main September 8, 2026 16:50
@doodlewind
doodlewind marked this pull request as ready for review September 8, 2026 16:50
@doodlewind
doodlewind merged commit 4ded19d into main Sep 8, 2026
1 check passed
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