Separate logical ownership, render publication, and GPU retirement across live entities, landblocks, particles, textures, mesh arenas, portal/UI teardown, and per-frame scratch storage. Add bounded DAT/texture caches, upload budgets, three-frame fence retirement, exact-incarnation appearance reconciliation, frame pacing, and extensive lifetime conformance coverage.\n\nThe seven-destination connected route now cuts peak working/private memory roughly in half, returns Caul to 125-153 FPS locally, and produces no WER or AMD reset.\n\nCo-authored-by: OpenAI Codex <codex@openai.com>
67 lines
2.3 KiB
C#
67 lines
2.3 KiB
C#
using AcDream.App.UI;
|
|
|
|
namespace AcDream.App.Tests.UI;
|
|
|
|
public sealed class UiElementChildOrderTests
|
|
{
|
|
[Fact]
|
|
public void StableTree_ReusesBothTraversalSnapshots()
|
|
{
|
|
var parent = new TestElement();
|
|
parent.AddChild(new TestElement { ZOrder = 2 });
|
|
parent.AddChild(new TestElement { ZOrder = 1 });
|
|
|
|
UiElement[] drawFirst = parent.ChildrenBackToFrontSnapshot();
|
|
UiElement[] drawSecond = parent.ChildrenBackToFrontSnapshot();
|
|
UiElement[] hitFirst = parent.ChildrenFrontToBackSnapshot();
|
|
UiElement[] hitSecond = parent.ChildrenFrontToBackSnapshot();
|
|
|
|
Assert.Same(drawFirst, drawSecond);
|
|
Assert.Same(hitFirst, hitSecond);
|
|
Assert.Equal([1, 2], drawFirst.Select(child => child.ZOrder).ToArray());
|
|
Assert.Equal([2, 1], hitFirst.Select(child => child.ZOrder).ToArray());
|
|
}
|
|
|
|
[Fact]
|
|
public void ChildZOrderChange_InvalidatesBothTraversalSnapshots()
|
|
{
|
|
var parent = new TestElement();
|
|
var first = new TestElement { ZOrder = 1 };
|
|
var second = new TestElement { ZOrder = 2 };
|
|
parent.AddChild(first);
|
|
parent.AddChild(second);
|
|
UiElement[] oldDraw = parent.ChildrenBackToFrontSnapshot();
|
|
UiElement[] oldHit = parent.ChildrenFrontToBackSnapshot();
|
|
|
|
first.ZOrder = 3;
|
|
UiElement[] newDraw = parent.ChildrenBackToFrontSnapshot();
|
|
UiElement[] newHit = parent.ChildrenFrontToBackSnapshot();
|
|
|
|
Assert.NotSame(oldDraw, newDraw);
|
|
Assert.NotSame(oldHit, newHit);
|
|
Assert.Same(second, newDraw[0]);
|
|
Assert.Same(first, newDraw[1]);
|
|
Assert.Same(first, newHit[0]);
|
|
Assert.Same(second, newHit[1]);
|
|
}
|
|
|
|
[Fact]
|
|
public void MembershipChange_InvalidatesSnapshotsWithoutMutatingPriorWalk()
|
|
{
|
|
var parent = new TestElement();
|
|
var first = new TestElement { ZOrder = 1 };
|
|
var second = new TestElement { ZOrder = 2 };
|
|
parent.AddChild(first);
|
|
UiElement[] prior = parent.ChildrenBackToFrontSnapshot();
|
|
|
|
parent.AddChild(second);
|
|
UiElement[] current = parent.ChildrenBackToFrontSnapshot();
|
|
|
|
Assert.Single(prior);
|
|
Assert.Same(first, prior[0]);
|
|
Assert.Equal(2, current.Length);
|
|
Assert.NotSame(prior, current);
|
|
}
|
|
|
|
private sealed class TestElement : UiElement;
|
|
}
|