the hover tax is pinned and cut, and a spell-less macro is a button
- a tooltip change costs ~1.3 ms — five whole-interface recomputes, each working as designed: the quad re-convert at 474 µs, the Lua tick at 287, the layout resolve at 200, bevy's `Assets<Mesh>` tax at ~270 and the mesh rebuild at 146 — pinned with new hover probes (a jitter dial, a `WOW_PROBE_HOVER_DUTY` duty cycle so run drift cancels, an `AssetChanged` tax meter), and the layout preamble's two whole-roster scans become lists maintained at the writer (52–83 µs → 1–11) - the splice compared this frame's entries against last frame's by index, so one inserted highlight shifted the 160 entries behind it and read as "everything changed"; it now aligns on `z` — an identity, not a position — and a `Text` entry that writes only quads became spliceable, so a tooltip change re-converts 22 entries instead of 520 (`convert` +439 µs → +107), with `WOW_UI_SPLICE_VERIFY` running the full conversion behind every spliced frame: 0 mismatches over 1,078 - a spell-less macro is a usable action button, not the 0.4 grey — the reference's usable compute has a dedicated leg answering usable for the bound-spell zero, cross-checked at the bytes in the reference's disassembly — and the button's Name line is written unconditionally from `GetActionText` as the reference does, so the macro's name sits under its icon and a `/cast` of a spell the character does not know now greys, which is also 1.12's behaviour (B340) - a capture bounds its run in wall-clock seconds, because a frame cap is no cap at the ~1 fps a starved `nextDrawable` leaves — 1800 frames is thirty minutes there — and the teardown backstop runs on every run as a liveness guarantee, carrying the exit code the run asked for; the Multisampling row reads Off / 2x / 4x, since "1x" contradicts the no-multisampling byte both of the reference's enumerators normalise to and the bit-depth prefix was identical on every row Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -154,6 +154,11 @@ pub(crate) struct UiFrameCost {
|
||||
/// full-conversion frame. Nonzero is the proof the splice path fired (the equivalence tests
|
||||
/// and the live `[ui-cost] spliced=` field both read it).
|
||||
pub(crate) spliced: usize,
|
||||
/// How many entries the splice *dropped* — drew last frame and does not draw now. A frame
|
||||
/// that only closes something has `spliced == 0` and still rode the splice, so this is the
|
||||
/// other half of "did the splice path fire" (decision 1638). Not a CSV column: the recorder's
|
||||
/// row is the phase timings, and `[ui-cost] dropped=` already carries it inline.
|
||||
pub(crate) dropped: usize,
|
||||
}
|
||||
|
||||
/// Does anything want [`UiFrameCost`] filled in this run? Measuring the split costs a clock read
|
||||
@@ -585,6 +590,19 @@ fn demo_unit_feed(script: Option<NonSendMut<UiScript>>, mut fired: Local<VmMemo<
|
||||
// it that this seed never fed, so the capture quietly stopped showing the "5" it exists to
|
||||
// prove (found while fixing decision 1301).
|
||||
script.set_bonus_bar_offset(1);
|
||||
// One MACRO slot too (button 4): a GM-style macro that casts nothing, so the capture
|
||||
// shows the macro-name line under the icon and the icon full-colour — B340's shape
|
||||
// (decision 1636). The table is seeded here because a capture has no character identity
|
||||
// for `ui_macro::load_macros` to read a file for; nothing overwrites it.
|
||||
script.set_macros(benilla_ui::script::MacroState {
|
||||
account: vec![benilla_ui::script::MacroView {
|
||||
name: "spawn".into(),
|
||||
texture: Some("Interface\\Icons\\Ability_Racial_Cannibalize".into()),
|
||||
body: ".spawn 16032".into(),
|
||||
local_only: false,
|
||||
}],
|
||||
character: Vec::new(),
|
||||
});
|
||||
for (action, icon, kind, id, count) in [
|
||||
(
|
||||
73,
|
||||
@@ -601,6 +619,13 @@ fn demo_unit_feed(script: Option<NonSendMut<UiScript>>, mut fired: Local<VmMemo<
|
||||
102,
|
||||
0,
|
||||
),
|
||||
(
|
||||
76,
|
||||
"Interface\\Icons\\Ability_Racial_Cannibalize",
|
||||
0x40,
|
||||
1,
|
||||
0,
|
||||
),
|
||||
(80, "Interface\\Icons\\INV_Misc_Food_16", 0x80, 117, 5),
|
||||
(84, "Interface\\Icons\\Spell_Holy_SealOfMight", 0x00, 103, 0),
|
||||
// The always-on multibars (MultiBars.xml): BottomLeft = actions 61..72, BottomRight
|
||||
@@ -636,6 +661,17 @@ fn demo_unit_feed(script: Option<NonSendMut<UiScript>>, mut fired: Local<VmMemo<
|
||||
consumable: kind == 0x80,
|
||||
}),
|
||||
);
|
||||
// The state feed has nothing to feed server-less (no `PlayerActions`), and a slot
|
||||
// with no pushed state answers `IsUsableAction` nil — the 0.4 grey on every icon,
|
||||
// which the `ui-actionbar` baseline wore for as long as it existed. Stand in for it
|
||||
// as this feed stands in for the unit feed: a live bar's resting state is usable.
|
||||
script.set_action_state(
|
||||
action,
|
||||
Some(benilla_ui::script::ActionState {
|
||||
usable: true,
|
||||
..Default::default()
|
||||
}),
|
||||
);
|
||||
}
|
||||
// The stance bar (StanceBar.xml): the synthetic warrior's three stances, battle active —
|
||||
// matches the bonus offset 1 above (battle stance page). Defensive shows the not-castable
|
||||
|
||||
Reference in New Issue
Block a user