render3d: a fog wall nearer than a layer's cards lets its impostor atlases go, and a fog that opens bakes them again
Inside the wall every instance is a mesh whose LOD2 casts its shadow, so a card is neither drawn nor cast there: fog_impostors.ludic frees a layer's atlases while wall + margin < its near (trees 420-480 m, rocks 320 m) and paints them again from the model when it opens past it (impostor_paint, split out of the bake). Impostor atlases get memory of their own, so a release goes back to the driver instead of leaving a hole in a shared block. R3D_FOG_AT=<frame> with R3D_FOG_TO=<m> changes the wall mid-run. At the overlook: 2102 MB off, 1824 MB at 30 m (249 -> 67 MB of atlases; the rest is the ground cover's card atlases, drawn inside the wall); opening re-bakes 16 layers in 42-46 ms, back to 2102 MB. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
6289564382
commit
7024f42789
6 changed files with 88 additions and 7 deletions
|
|
@ -429,7 +429,9 @@ function gvk_mem_new(render3d_st: mut Render3dState, req: bytes, want: int, imag
|
|||
# aligned: carved at the bare size, every small buffer left a sliver before the next one that no
|
||||
# later one could use - 3,718 of them among 3,968 buffers, and the free list past its bound
|
||||
let span = (size + align - 1) / align * align
|
||||
if size <= gvk_own_over(render3d_st) {
|
||||
# an impostor atlas has memory of its own: a fog wall lets it go (fog_impostors.ludic), and inside a
|
||||
# shared block its room went back to nobody while the block's other tenants stayed
|
||||
if size <= gvk_own_over(render3d_st) and render3d_st.gvk_tag != VKM_IMPOSTOR {
|
||||
var kind = t * 2
|
||||
if image { kind += 1 }
|
||||
var i = 0
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue