perf(streaming): scope reveal warmup spatially
Source composite warmup from the canonical published destination neighborhood, including quiesced static and live projections, instead of rescanning the retained Far-tier world after every membership edge.
This lifecycle correction applies to both draw paths, preserving ef1d263337 as the sole G4 visual rollback.
Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
129dd77ddd
commit
03b10183e9
5 changed files with 212 additions and 6 deletions
|
|
@ -0,0 +1,61 @@
|
|||
using AcDream.App.Rendering.Wb;
|
||||
using AcDream.App.Streaming;
|
||||
using AcDream.Core.World;
|
||||
using DatReaderWriter.DBObjs;
|
||||
using System.Numerics;
|
||||
|
||||
namespace AcDream.App.Tests.Rendering.Wb;
|
||||
|
||||
public sealed class CompositeWarmupEntitySourceTests
|
||||
{
|
||||
[Fact]
|
||||
public void RefreshTracksOnlyDestinationNeighborhoodMembership()
|
||||
{
|
||||
var center = Entity(1);
|
||||
var neighbor = Entity(2);
|
||||
var far = Entity(3);
|
||||
var world = new GpuWorldState();
|
||||
world.AddLandblock(Landblock(0x1010FFFFu, center));
|
||||
world.AddLandblock(Landblock(0x1110FFFFu, neighbor));
|
||||
world.AddLandblock(Landblock(0x1310FFFFu, far));
|
||||
var source = new CompositeWarmupEntitySource(world);
|
||||
|
||||
source.Refresh(0x10100001u, radius: 1);
|
||||
|
||||
Assert.Equal(world.FlatViewGeneration, source.Generation);
|
||||
Assert.Equal([center, neighbor], source.Entities);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RefreshObservesLaterMembershipWithoutReplacingItsStableView()
|
||||
{
|
||||
var center = Entity(1);
|
||||
var later = Entity(2);
|
||||
var world = new GpuWorldState();
|
||||
world.AddLandblock(Landblock(0x1010FFFFu, center));
|
||||
var source = new CompositeWarmupEntitySource(world);
|
||||
source.Refresh(0x10100001u, radius: 0);
|
||||
IReadOnlyList<WorldEntity> stableView = source.Entities;
|
||||
|
||||
world.AddLandblock(Landblock(0x1010FFFFu, center, later));
|
||||
source.Refresh(0x10100001u, radius: 0);
|
||||
|
||||
Assert.Same(stableView, source.Entities);
|
||||
Assert.Equal([center, later], source.Entities);
|
||||
Assert.Equal(world.FlatViewGeneration, source.Generation);
|
||||
}
|
||||
|
||||
private static LoadedLandblock Landblock(
|
||||
uint id,
|
||||
params WorldEntity[] entities) =>
|
||||
new(id, new LandBlock(), entities);
|
||||
|
||||
private static WorldEntity Entity(uint id) => new()
|
||||
{
|
||||
Id = id,
|
||||
SourceGfxObjOrSetupId = 0x02000001u,
|
||||
Position = Vector3.Zero,
|
||||
Rotation = Quaternion.Identity,
|
||||
MeshRefs = Array.Empty<MeshRef>(),
|
||||
};
|
||||
}
|
||||
|
|
@ -508,6 +508,42 @@ public sealed class GpuWorldStateVisibilityTests
|
|||
Assert.DoesNotContain(destination, pair => pair.Key == 0u);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadinessNeighborhood_CopiesStaticAndLiveWhileWorldIsQuiesced()
|
||||
{
|
||||
var availability = new WorldGenerationAvailabilityState();
|
||||
availability.Begin(7);
|
||||
var centerStatic = Entity(1, 0u);
|
||||
var centerLive = Entity(2, 0x70000001u);
|
||||
var neighborStatic = Entity(3, 0u);
|
||||
var farStatic = Entity(4, 0u);
|
||||
var state = new GpuWorldState(availability: availability);
|
||||
state.AddLandblock(new LoadedLandblock(
|
||||
0x1010FFFFu,
|
||||
new LandBlock(),
|
||||
new[] { centerStatic, centerLive }));
|
||||
state.AddLandblock(new LoadedLandblock(
|
||||
0x1110FFFFu,
|
||||
new LandBlock(),
|
||||
new[] { neighborStatic }));
|
||||
state.AddLandblock(new LoadedLandblock(
|
||||
0x1310FFFFu,
|
||||
new LandBlock(),
|
||||
new[] { farStatic }));
|
||||
var destination = new List<WorldEntity> { farStatic };
|
||||
|
||||
state.CopyPublishedEntitiesNearLandblockForReadiness(
|
||||
0x10100001u,
|
||||
1,
|
||||
destination);
|
||||
|
||||
Assert.Equal(3, destination.Count);
|
||||
Assert.Contains(centerStatic, destination);
|
||||
Assert.Contains(centerLive, destination);
|
||||
Assert.Contains(neighborStatic, destination);
|
||||
Assert.DoesNotContain(farStatic, destination);
|
||||
}
|
||||
|
||||
private static WorldEntity Entity(uint id, uint guid) => new()
|
||||
{
|
||||
Id = id,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue