docs(overhaul): correct S5 c1 review comments

Remove the deleted outdoor-fallback claim, describe the visible-cell union as diagnostics rather than a shared admission answer, and distinguish the landscape particle, resident-light, and future shadow consumers.

Correct ParticleSystem complexity prose: only the SortedSet indexes have logarithmic lifecycle edges; the view list uses binary-search insertion with linear shift and linear removal.

Focused verification: Core ParticleSystemTests 47/47; App visibility/terrain/frame/renderer 38/38; AP-116 settings/live-object 3/3; git diff --check clean. No behavior, tests, register, or architecture change.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-04 16:38:03 +02:00
parent 282fe87fb3
commit 4d1110812c
4 changed files with 33 additions and 16 deletions

View file

@ -360,3 +360,15 @@ visibility/terrain/frame/renderer tests, and 3 AP-116 settings/live-object
tests), commit once, then return to a narrow retail comment-truth re-review. tests), commit once, then return to a narrow retail comment-truth re-review.
The production/gate-honesty lens remains undispatched until that re-review The production/gate-honesty lens remains undispatched until that re-review
passes. A third fix round still stops the chunk. passes. A third fix round still stops the chunk.
### 10.1 Fix-round-1 implementation result
The three stale descriptions are corrected without behavior or assertion
changes. `UseWorldView` now names only the completed retail PView and explicitly
excludes the null-root safety draw. `CopyVisibleCellsTo` describes a diagnostic
union and names the distinct particle, point-light, and future directional-
shadow consumers. `ParticleSystem` scopes the logarithmic lifecycle statement
to its `SortedSet` indexes and records the sorted list's binary-search plus
linear-shift insertion and linear search/compaction removal costs. Focused gate
results: Core `ParticleSystemTests` 47/47, App visibility/terrain/frame/renderer
38/38, and AP-116 settings/live-object 3/3; `git diff --check` is clean.

View file

@ -41,10 +41,11 @@ public sealed class ParticleVisibilityController : IWorldSceneParticleVisibility
} }
/// <summary> /// <summary>
/// Declares that this frame has an authoritative world-visibility product. /// Declares that this frame has the completed retail PView product: one
/// That product can come from the unified retail PView or from the outdoor /// viewer position plus its exact walk-owned landscape-cell set. Frames
/// landscape fallback. Login and portal-space frames deliberately omit it; /// without that PView product, including login, portal space, and the
/// dedicated pass and examination emitters carry explicit bypass policies. /// null-root terrain safety draw, deliberately omit it; dedicated-pass and
/// examination emitters carry explicit bypass policies.
/// </summary> /// </summary>
public void UseWorldView() public void UseWorldView()
{ {

View file

@ -868,11 +868,14 @@ internal sealed class WalkFrameDriver : IWalkEventSink, IWalkLookInViewSource
} }
/// <summary> /// <summary>
/// Copies the walk's complete retail <c>CObjCell::IsInView</c> answer: /// Copies the walk's diagnostic union: EnvCells reached by interior
/// EnvCells reached by interior floods/look-ins plus outdoor land cells /// floods/look-ins plus outdoor land cells visited by the landscape walk.
/// visited by the landscape walk. The two families stay separately /// The two families remain separately retained because EnvCells are shell
/// retained because only the first is valid EnvCell batch input, but /// preparation input while only the landscape half feeds land-cell particle
/// particles, lights, and shadows consume their union. /// eligibility; EnvCell particle eligibility is the constant-true virtual.
/// Point lights use the resident registry, and directional-shadow use of the
/// landscape product remains owned by S5-c2. No admission path consumes this
/// union as a complete <c>CObjCell::IsInView</c> answer.
/// </summary> /// </summary>
internal void CopyVisibleCellsTo(HashSet<uint> destination) internal void CopyVisibleCellsTo(HashSet<uint> destination)
{ {

View file

@ -14,16 +14,17 @@ public sealed class ParticleSystem : IParticleSystem
private readonly EmitterDescRegistry _registry; private readonly EmitterDescRegistry _registry;
private readonly Random _rng; private readonly Random _rng;
private readonly Dictionary<int, ParticleEmitter> _byHandle = new(); private readonly Dictionary<int, ParticleEmitter> _byHandle = new();
// Handles are monotonic, so sorted indexes preserve retail emitter-spawn // Handles are monotonic, so the SortedSet indexes preserve retail
// order while making every lifecycle edge O(log E). The old List.Remove // emitter-spawn order while making their lifecycle edges O(log E). Their
// hard-stop path was O(E) and became visible when portal routes retained // predecessor List.Remove hard-stop path was O(E) and became visible when
// thousands of finite/fading emitters. // portal routes retained thousands of finite/fading emitters.
private readonly SortedSet<int> _allHandles = []; private readonly SortedSet<int> _allHandles = [];
private readonly SortedSet<int> _simulationHandles = []; private readonly SortedSet<int> _simulationHandles = [];
// ApplyRetailView is a per-frame production path. SortedSet's enumerator // ApplyRetailView is a per-frame production path. SortedSet's enumerator
// allocates its traversal stack, so retain this subset as a sorted list; // allocates its traversal stack, so retain this subset as a sorted list.
// lifecycle mutations pay the binary insertion/removal cost and the // Insertion uses a binary search followed by a linear list shift; removal
// warmed view walk stays allocation-free in emitter-spawn order. // searches and compacts linearly. Lifecycle mutations pay those costs so
// the warmed view walk stays allocation-free in emitter-spawn order.
private readonly List<int> _worldSimulationHandles = []; private readonly List<int> _worldSimulationHandles = [];
private readonly SortedSet<int>[] _renderableHandlesByPass = private readonly SortedSet<int>[] _renderableHandlesByPass =
[[], [], []]; [[], [], []];