acdream/tests/AcDream.App.Tests/Rendering/Residency/RetainedScratchCapacityPolicyTests.cs
Erik f2644d42c2 perf(render): bound animation and alpha scratch residency
Complete Slice D3 by replacing the unbounded animation dictionary with a concurrent byte/count LRU and by putting the three retail alpha scratch owners behind one typed aggregate budget. Preserve immediate growth and draw order while reclaiming one-frame density spikes after sustained under-use. Close stale bounds-cache issue evidence without inventing a cache.
2026-07-24 16:34:28 +02:00

86 lines
2.6 KiB
C#

using AcDream.App.Rendering.Residency;
namespace AcDream.App.Tests.Rendering.Residency;
public sealed class RetainedScratchCapacityPolicyTests
{
[Fact]
public void AlphaBudgetProfilePartitionsTheAggregateExactly()
{
AlphaScratchBudgetProfile profile =
AlphaScratchBudgetProfile.Create(16 * 1024 * 1024);
Assert.Equal(4 * 1024 * 1024, profile.QueueBytes);
Assert.Equal(8 * 1024 * 1024, profile.DispatcherBytes);
Assert.Equal(4 * 1024 * 1024, profile.ParticleBytes);
Assert.Equal(16 * 1024 * 1024, profile.TotalBytes);
}
[Fact]
public void SpikeRetainsWarmCapacityUntilDemandFallsThenConverges()
{
var policy = new RetainedScratchCapacityPolicy(
budgetBytes: 1024,
lowDemandSamplesBeforeShrink: 3);
Assert.Equal(
4096,
policy.ObserveAndSelectCapacity(
currentCapacity: 4096,
requiredCapacity: 4096,
bytesPerUnit: 4,
minimumCapacity: 64,
growthQuantum: 64));
Assert.Equal(4096, ObserveLowDemand(policy));
Assert.Equal(4096, ObserveLowDemand(policy));
int converged = ObserveLowDemand(policy);
Assert.InRange(converged, 64, 256);
Assert.True((long)converged * 4 <= 1024);
}
[Fact]
public void SustainedLegitimateDemandIsNeverTrimmedBelowRequirement()
{
var policy = new RetainedScratchCapacityPolicy(
budgetBytes: 1024,
lowDemandSamplesBeforeShrink: 2);
for (int i = 0; i < 10; i++)
{
Assert.Equal(
4096,
policy.ObserveAndSelectCapacity(
currentCapacity: 4096,
requiredCapacity: 4096,
bytesPerUnit: 4,
minimumCapacity: 64,
growthQuantum: 64));
}
}
[Fact]
public void RequiredGrowthIsImmediateAndQuantumRounded()
{
var policy = new RetainedScratchCapacityPolicy(1024);
Assert.Equal(
320,
policy.ObserveAndSelectCapacity(
currentCapacity: 64,
requiredCapacity: 257,
bytesPerUnit: 4,
minimumCapacity: 64,
growthQuantum: 64));
}
private static int ObserveLowDemand(
RetainedScratchCapacityPolicy policy) =>
policy.ObserveAndSelectCapacity(
currentCapacity: 4096,
requiredCapacity: 32,
bytesPerUnit: 4,
minimumCapacity: 64,
growthQuantum: 64);
}