Research: a city that sounds as loud as it is, and occlusion culling at street level #309
Labels
No labels
agent
agent:ci
agent:done
agent:failed
agent:needs-input
agent:refined
agent:refining
agent:running
agent:shipped
agent:skip
autonomous
autopilot
driven
local
plan
proposal
qa
qa-gap
research
retro
ship
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jeroen/cartopolis#309
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Research night 2026-09-30 (unattended, read-only). Two areas, each checked against a live service or the code tonight. Neither is in
docs/direction.md, an open issue, or #308.1. A city that sounds as loud as it is: the national noise map under the soundscape
What. The soundscape is the avatar's own sounds and nothing else.
systems/player/soundscape.rs:1-2: "footsteps timed off the gait, a landing thud, and wind that rises with speed." The Grote Markt and a quiet courtyard sound exactly the same. RIVM publishes the Netherlands' modelled environmental-noise map (Lden, the EU noise-directive measure, all sources combined) as a 10 m national raster. A city ambience bed whose volume follows it would make busy streets loud and parks and courtyards quiet, from a register rather than a guess.Why it fits. "Twin is the load-bearing word: the content comes from registries, never from invention." And value 2: "Official sources first. PDOK, the Kadaster… public registers with a licence and an interface." This one is RIVM (Atlas Leefomgeving). It is a modelled register rather than a measured one: it is computed from traffic counts and infrastructure. That should be said plainly, but it is the official figure, and it beats having no noise at all.
Evidence, checked 2026-09-30 ~00:00 UTC:
WMS
https://data.rivm.nl/geo/alo/wms, layersrivm_20191112_g_geluidkaart_lden_alle_bronnenand…_lden_wegverkeer, plus anlnight_wegverkeerlayer for road traffic at night. Capabilities:Fees NONE,AccessConstraints NONE.GetFeatureInfo, all sources, dB Lden:
A 15 dB spread across 2 km of one city.
WCS
DescribeCoveragefor the same coverage: EPSG:28992 (RD New), 10 m cells, 26,400 × 31,200 over the whole country.GetCoveragewithsubset=X(233000,234500)&subset=Y(581500,583000)returned 200 image/tiff, 150×150, 16-bit, 166 KB (the axis labels areX/Y;E/Nreturn 404). As one byte per cell, a z14 cell is about 22 KB, or about 45 KB at 16 bits.soundscape.rsalready synthesises its sounds and has a looping-ambience path (:623, the wind loop), so a city bed is a sibling sound, not new machinery.What players get. Walking out of a quiet side street onto the Vismarkt, you hear the city get louder. A park is quiet. At night, with the
lnightlayer, the city calms down. It is also the first thing in the app that makes being in a place audible rather than only visible.Size. Medium, in two pieces, following atlas's existing shape:
noisedataset writing a per-cellu8dB grid;TerrainField::at) and mapping dB to the gain of one synthesised city bed.Risks.
docs/notes/container-audio.md), so the timbre is Jeroen's call on a device. The machine-checkable part is the gain as a function of dB.First ticket. Atlas: publish the RIVM Lden map as a per-cell grid. Acceptance:
2. Draws are the lever: Bevy's GPU occlusion culling at street level
What. Bevy 0.19 ships two-phase GPU occlusion culling (
bevy_render::occlusion_culling::OcclusionCulling; its doc: "fully dynamic and requires no baking step. The CPU overhead is minimal"). It is opt-in and unused here. At street level almost the whole city is behind the first row of façades.Why it fits. Value 5, "The frame budget is not negotiable", and the render survey's own finding (
docs/notes/render-performance-survey.md:171): "draw count is the lever". That note measured 191 fewer draws takingcityfrom 69 to 89 fps (:214).Evidence.
git grep OcclusionCullingon main: nothing.DepthPrepass, per its own doc comment. The prepass was removed on 2026-09-21 together with ambient occlusion (634be61,road_depth.rs:176-181), and the survey recorded the old prepass at "3.0× overdraw" atorbit(render-performance-survey.md:~255). So the experiment is to add back a depth-only prepass and see whether culling pays for it. That is a real trade, not a free win.quality::Capabilities::compute_shadersalready exists, and is exactly the gate a GPU-culling path needs: it runs on compute.lod22::MAX_CELL_MESH_BYTES). Occlusion is tested per mesh bounding box, so big merged meshes occlude well but are occluded poorly. The number of meshes per cell at street level is what to measure first.What players get. Frame time at street level, which is where people walk, and on handhelds, where the survey says the render thread is the wall.
Size. Small to measure, medium to ship.
Risks.
cargo perf --repeat(#306) to separate a real change from run-to-run spread.road_depth.rs:160-190must stay handled.First ticket.
CARTO_OCCLUSION=1addsDepthPrepass+OcclusionCullingto the camera, gated onCapabilities::compute_shaders. It is judged by acargo perf --repeat 3A/B ondeck-1at a street-level scenario and atcity, with GPU frame time as median and range, on and off. Whether it becomes the default is decided by those numbers, and "not worth it" goes into the survey note.Recommendation
Area 1, if a player-visible change is wanted next. Its data side is fully verified tonight, keyless and with no stated constraints, and its first ticket is testable without anyone's ears. Area 2 is the better performance bet, but it should wait until #306 is merged, because its verdict is only as good as the spread measurement it depends on.