perf(rendering): retire production entity partition

Route production meshes and attached particles from the exact retained PView frame ranges, while keeping the former WorldEntity partition only for standalone tests and explicit diagnostic/oracle probes. Copy retained source/count facts before arena release so world diagnostics no longer require the old partition. Record the accepted G4 visual gate and open the exact G5 production matrix.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-25 10:50:57 +02:00
parent 14b48cf553
commit 10ccce3f2d
11 changed files with 452 additions and 125 deletions

View file

@ -64,6 +64,12 @@ internal sealed class RetailPViewParticleClassifications
foreach (WorldEntity owner in owners)
_outdoor.Add(owner.Id);
}
public void ReplaceOutdoor(IReadOnlySet<uint> ownerIds)
{
_outdoor.Clear();
_outdoor.UnionWith(ownerIds);
}
}
/// <summary>
@ -452,7 +458,7 @@ internal sealed class RetailPViewPassExecutor :
animatedEntityIds: frame.AnimatedEntityIds);
}
_particleClassifications.ReplaceOutdoor(context.ParticleOwners);
_particleClassifications.ReplaceOutdoor(context.ParticleOwnerIds);
_diagnostics.EmitOutStageParticles(
RenderingDiagnostics.ProbeOutStageEnabled,
@ -539,15 +545,14 @@ internal sealed class RetailPViewPassExecutor :
{
if (_particles is null
|| _particleRenderer is null
|| context.CellEntities.Count == 0)
|| context.ParticleOwnerIds.Count == 0)
{
return;
}
HashSet<uint> visible = _particleClassifications.Visible;
visible.Clear();
foreach (WorldEntity entity in context.CellEntities)
visible.Add(entity.Id);
visible.UnionWith(context.ParticleOwnerIds);
if (visible.Count == 0)
return;
@ -562,15 +567,14 @@ internal sealed class RetailPViewPassExecutor :
public void DrawDynamicsParticles(
RetailPViewFrameInput frame,
IReadOnlyList<WorldEntity> survivors)
IReadOnlySet<uint> ownerIds)
{
if (_particles is null || _particleRenderer is null || survivors.Count == 0)
if (_particles is null || _particleRenderer is null || ownerIds.Count == 0)
return;
HashSet<uint> dynamics = _particleClassifications.Dynamics;
dynamics.Clear();
foreach (WorldEntity entity in survivors)
dynamics.Add(entity.Id);
dynamics.UnionWith(ownerIds);
if (dynamics.Count == 0)
return;