perf(ui): scope cooldown heartbeat to visible items

This commit is contained in:
Erik 2026-07-25 05:12:58 +02:00
parent f2a015be8e
commit 6b56f4bef2
5 changed files with 132 additions and 3 deletions

View file

@ -59,4 +59,82 @@ public sealed class ItemCooldownUiControllerTests
Assert.Equal(0u, list.Cell.ActiveCooldownSprite());
Assert.Equal(0, spellbook.ActiveCount);
}
[Fact]
public void Hidden_ancestor_removes_list_from_retail_heartbeat_scope()
{
var objects = new ClientObjectTable();
objects.AddOrUpdate(new ClientObject
{
ObjectId = 0x5001u,
CooldownId = 42u,
CooldownDuration = 30d,
});
var spellbook = new Spellbook();
spellbook.OnEnchantmentAdded(new ActiveEnchantmentRecord(
SpellId: 0x802Au,
LayerId: 1u,
Duration: 30d,
CasterGuid: 0u,
Bucket: Spellbook.CooldownBucket,
StartTime: 100d));
var root = new UiPanel();
var window = new UiPanel();
var list = new UiItemList();
list.Cell.SetItem(0x5001u, 99u);
root.AddChild(window);
window.AddChild(list);
uint[] sprites = Enumerable.Range(1, 10)
.Select(index => 0x06000000u + (uint)index)
.ToArray();
ItemCooldownUiController controller = ItemCooldownUiController.Bind(
root,
spellbook,
objects,
() => 112.5d,
new ItemCooldownAssets(sprites));
Assert.Equal(sprites[5], list.Cell.ActiveCooldownSprite());
window.Visible = false;
controller.Tick();
Assert.Equal(0u, list.Cell.ActiveCooldownSprite());
window.Visible = true;
controller.Tick();
Assert.Equal(sprites[5], list.Cell.ActiveCooldownSprite());
}
[Fact]
public void Empty_cooldown_registry_skips_clock_and_item_walk()
{
var objects = new ClientObjectTable();
objects.AddOrUpdate(new ClientObject
{
ObjectId = 0x5001u,
CooldownId = 42u,
CooldownDuration = 30d,
});
var spellbook = new Spellbook();
var root = new UiPanel();
var list = new UiItemList();
list.Cell.SetItem(0x5001u, 99u);
root.AddChild(list);
int clockReads = 0;
ItemCooldownUiController controller = ItemCooldownUiController.Bind(
root,
spellbook,
objects,
() =>
{
clockReads++;
return 100d;
},
new ItemCooldownAssets(
Enumerable.Range(1, 10).Select(index => (uint)index).ToArray()));
controller.Tick();
Assert.Equal(0, clockReads);
Assert.Equal(0u, list.Cell.ActiveCooldownSprite());
}
}