render3d: recycle texture and buffer ids, free a released model whole, actor_release
A freed texture or buffer id goes on a spare list the next one takes; tex_note_size keeps sizes by id. model_release frees prims, meshes, material names, the skin and leaves gltf_cached. actor_release takes an actor off the stage and actor_new reuses its record (ECS's Things come and go all day). steady.ludic: an actor round at 0 bytes over 2000. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
2fe4018d28
commit
9b482d609a
14 changed files with 208 additions and 39 deletions
|
|
@ -27,6 +27,7 @@ function gltf_tex_unref(render3d_st: mut Render3dState, id: int) -> void {
|
|||
function gltf_tex_forget(render3d_st: mut Render3dState, i: int) -> void {
|
||||
let last = render3d_st.gltf_tex_n - 1
|
||||
let paths = render3d_st.gltf_tex_paths
|
||||
free(paths[i])
|
||||
paths[i] = paths[last]
|
||||
render3d_st.gltf_tex_ids[i] = render3d_st.gltf_tex_ids[last]
|
||||
render3d_st.gltf_tex_refs[i] = render3d_st.gltf_tex_refs[last]
|
||||
|
|
@ -42,6 +43,7 @@ function gltf_mats_forget(render3d_st: mut Render3dState, id: int) -> void {
|
|||
if render3d_st.gltf_mat_diff[k] == id or render3d_st.gltf_mat_nrm[k] == id or render3d_st.gltf_mat_arm[k] == id {
|
||||
let last = render3d_st.gltf_mat_n - 1
|
||||
let names = render3d_st.gltf_mat_names
|
||||
free(names[k])
|
||||
names[k] = names[last]
|
||||
render3d_st.gltf_mat_diff[k] = render3d_st.gltf_mat_diff[last]
|
||||
render3d_st.gltf_mat_nrm[k] = render3d_st.gltf_mat_nrm[last]
|
||||
|
|
@ -54,17 +56,31 @@ function gltf_mats_forget(render3d_st: mut Render3dState, id: int) -> void {
|
|||
}
|
||||
}
|
||||
|
||||
# Let a model go: every primitive's mesh, and its textures once no other model uses them. The
|
||||
# caller says when - no actor may draw the model afterwards (a released model's prims are emptied,
|
||||
# so a stale draw of it draws nothing).
|
||||
# Let a model go: every primitive's mesh, and its textures once no other model uses it; the
|
||||
# primitives, their meshes and the model itself are freed, and a model gltf_cached handed out
|
||||
# leaves its cache. The caller says when: nothing may draw the model, or hold it, afterwards. For
|
||||
# a model gltf_load or gltf_cached made (a procedural one - a card, a blade - owns its parts otherwise).
|
||||
function model_release(render3d_st: mut Render3dState, m: Model) -> void {
|
||||
if m == null or m.prims == null { return }
|
||||
for i in 0 .. len(m.prims) {
|
||||
let pr = m.prims[i]
|
||||
if pr.mesh != null { gpu_mesh_free(render3d_st, pr.mesh); pr.mesh = null }
|
||||
gltf_tex_unref(render3d_st, pr.diff); gltf_tex_unref(render3d_st, pr.nrm); gltf_tex_unref(render3d_st, pr.arm)
|
||||
pr.diff = 0; pr.nrm = 0; pr.arm = 0
|
||||
if m == null { return }
|
||||
gltf_cached_forget(render3d_st, m)
|
||||
if m.prims != null {
|
||||
for i in 0 .. len(m.prims) {
|
||||
let pr = m.prims[i]
|
||||
gltf_tex_unref(render3d_st, pr.diff); gltf_tex_unref(render3d_st, pr.nrm); gltf_tex_unref(render3d_st, pr.arm)
|
||||
if pr.mesh != null { mesh_release(render3d_st, pr.mesh) }
|
||||
if pr.name != null { free(pr.name) }
|
||||
free(pr)
|
||||
}
|
||||
free(m.prims)
|
||||
}
|
||||
let prims = m.prims
|
||||
while len(prims) > 0 { List.pop(prims) }
|
||||
skin_free(m.skin)
|
||||
free(m)
|
||||
}
|
||||
|
||||
# a mesh and what it holds: its buffers (their handles given back), its layout and buffer lists
|
||||
function mesh_release(render3d_st: mut Render3dState, me: Mesh) -> void {
|
||||
gpu_mesh_free(render3d_st, me)
|
||||
if me.attrs != null { free(me.attrs) }
|
||||
if me.vbufs != null { free(me.vbufs) }
|
||||
free(me)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue