Status
SteamPeaks
ChartsSalesUpcomingPatchesEventsCalculator
New on SteamEvery app, DLC and depot the minute Steam creates itAppsEvery app on Steam, newest change firstPackagesSubs and bundles, and what each containsDepotsDepots, manifests and install sizesTagsSteam's user tags and the games under themDevelopers & publishersCompanies and their cataloguesTechnologiesEngines, SDKs and anti-cheat found in the filesChange historyEvery PICS changelist as it lands
SignalsNineteen readings of the whole catalogueCompareAny games side by sideRecordsAll-time peaks and the days they were setReportsWeekly and monthly write-upsAlerts & newsroomWatch a game, get told when it movesSteam statusIs Steam up, right nowWeb API explorerTry the endpoints in the browser
EventsSteam's own events and the sales calendarCalculatorWhat a Steam account is worth, and its pile of shame
/
Sign in
/
SteamPeaks
The ultimate resource for Steam data.
ExploreChartsSalesSales and festsUpcomingPatchesEventsRecordsTrendingSignals
DatabaseAppsPackagesDepotsTagsDevelopersTechnologiesChange history
ToolsCalculatorCompareSearchAlertsSteam statusAPI
SiteMethodologyFAQDiscordSupportSign in via Steam
Not affiliated with Valve or Steam. Game names and artwork belong to their owners. All times UTC.
PrivacyCookiesFair useStatus
InfinicityEventsDev Blog: Tile caching
Community

Dev Blog: Tile caching

Infinicity · published 9 Dec 2025, 19:01 UTC

All eventsPlayers around this dateRead on Steam

Tile Caching = 159x Faster City Streaming

Today I want to share a technical update rather than a visual one but it’s a huge boost for performance. My game uses procedural city tiles. Generating a full city tile costs around 1 millisecond. When the player is flying fast over the world, dozens of tiles may need to be created quickly, and that can become a bottleneck even when each tile is loaded in a background thread (actually as a tile load task serviced by a fixed sized pool of threads). So I implemented a tile caching system and the speedups are dramatic.

Benchmark Results

Here’s how long each operation now takes:

  • Full city generation: 1.08 ms

  • Generate + save to cache (first time): 4.09 ms

  • Load from cache (disk hit): 6.79 µs

  • Load tile already in memory: 6.8 ns

That means loading from cache is roughly 159x faster than generating a tile from scratch. That’s a huge performance win for streaming an open world.

How the Cache Works

The core idea is simple:

  1. Generate the tile once.

  2. Serialize the result to disk.

  3. Next time, load it instead of regenerating it.

Some technical details:

  • I compute a BLAKE3 hash of the map file to detect changes. If the map changes, the cache automatically invalidates.

  • Each tile uses a filename based on its coordinates, e.g. 5_7.bin.

  • Tile requests return a std::shared_future, so only the first thread generates the tile others wait for the same result.

  • The system is fully thread-safe and works perfectly with my streaming worker threads.

Where the Cache Lives

The game ships on Steam for Windows and Linux, including AppImage builds. AppImages are mounted as read-only, so the cache must go into the player’s writable directories, not beside the game files. Here’s where tile cache files are stored:

  • Windows: %LOCALAPPDATA%/Infinicity/TileCache

  • Linux / Steam Deck: $XDG_CACHE_HOME/Infinicity/TileCache or ~/.cache/Infinicity/TileCache

This keeps everything clean, safe, and consistent with OS conventions.

What I (re)Learned

  • Caching procedural data is a massive win for performance.

  • Hashing the map file is a clean solution to cache invalidation.

  • Don't write to the game's install directory especially with AppImages.

  • std::shared_future is perfect for eliminating redundant work across threads.

  • strace is an excellent debugging tool when you want to see where your game is trying to write files.

Tile caching has completely transformed streaming performance in the world and it’s exciting to see how much smoother everything feels now. More updates soon!

More from Infinicity

Other announcements

All events
Community26 Dec 2025Procedural Object Placement with Variable-Radius Poisson Disk Sampling and noiseWhen generating large procedural worlds, placing objects believably is harder than it looks. Trees shouldn’t overlap. Rocks shouldn’t clump unnaturally. Buildings need breathing room. And ideally, all of this should be controllable, performant, and compatible with procedural generation. A few years ago, while working on procedural world generation for my game, I ran into exactly this problem i.…Community17 Dec 2025Turning Real Footage into Game Animations (and Why I Open-Sourced the Tool)One of the challenges I’ve been thinking about a lot while working on Infinicity is animation. I wanted characters that feel hand-animated and expressive but without relying on huge animation budgets or locking myself into a very rigid art style. I also wanted a workflow that lets me iterate quickly i.e. change timing, style, or scale without redoing everything from scratch. That led me down an…Community13 Dec 2025Player moddable terrain feature addedI’ve added a new feature that lets players tweak the mountain noise layers in real-time. Previously, the terrain was generated using layers of noise with fixed frequency and amplitude. Now players can adjust these parameters to shape the mountains exactly how they like whether that’s jagged peaks, rolling hills, or something in between. This gives a lot more expressive freedom while exploring o…