Refresh retained presentation references
This commit is contained in:
@@ -126,21 +126,20 @@ public sealed class GodotAdvHost : IHost
|
||||
_frameSignal.Set();
|
||||
}
|
||||
|
||||
// Main thread, once per rendered frame: releases a VM thread parked in FrameYield/Sleep.
|
||||
// Main thread, once per rendered frame: releases a VM thread parked in Sleep or a presentation/input wait.
|
||||
public void PulseFrame() => _frameSignal.Set();
|
||||
|
||||
// Native presentation trace: ordinary opcode bursts run to the next service boundary in a few
|
||||
// milliseconds and are not frame-paced. Pacing belongs to 0x21c, sleep, and input waits below.
|
||||
public void FrameYield() { }
|
||||
|
||||
// op 0xc8: block the VM background thread so the main-thread compositor (Main.Recomposite in _Process)
|
||||
// presents the current retained GfxState — this is what makes the sleep-paced opening burst animate.
|
||||
// op 0xc8: block the VM background thread while the main-thread compositor keeps presenting retained state.
|
||||
// Time-based sibling of WaitForInput's suspend. The native op arms a non-blocking main-loop-polled timer;
|
||||
// blocking this throwaway task thread is behaviorally equivalent given our threading model. Operand is
|
||||
// MILLISECONDS (docs/engine-re.md sleep section + opcodes.toml 0xc8). Headless CLI hosts no-op it (parity).
|
||||
public double SleepScale = 1.0; // --sleep-scale <f>: debug multiplier to slow/speed the paced opening for inspection
|
||||
// Wait on the unified FrameClock timebase (not Thread.Sleep) so a future Speed multiplier scales
|
||||
// sleeps together with the throttle and the tween. Main._Process advances the clock + pulses each frame.
|
||||
public double SleepScale = 1.0; // --sleep-scale <f>: debug multiplier for explicit op-0xc8 holds only
|
||||
// Wait on the unified FrameClock timebase (not Thread.Sleep) so the Speed multiplier scales
|
||||
// sleeps together with retained presentation clocks. Main._Process advances the clock + pulses each frame.
|
||||
public void Sleep(long duration)
|
||||
{
|
||||
long ms = (long)System.Math.Clamp(duration * SleepScale, 0, 60_000); // cap so a pathological script can't hang the window
|
||||
|
||||
@@ -96,8 +96,8 @@ public partial class Main : Godot.Control
|
||||
bool boot = System.Array.IndexOf(userArgs, "--boot") >= 0; // run SYSTEM4's state prefix first
|
||||
string scene = "SC0000"; // --scene <NAME>: which scene to play (default SC0000)
|
||||
var seeds = new List<(int Addr, long Val)>(); // --seed 0xADDR=VAL (repeatable) — initial global state
|
||||
double sleepScale = 1.0; // --sleep-scale <f>: slow/speed the paced opening for inspection
|
||||
double speed = 1.0; // --speed <f>: whole-runtime diagnostic speed
|
||||
double sleepScale = 1.0; // --sleep-scale <f>: scale explicit op-0xc8 holds
|
||||
double speed = 1.0; // --speed <f>: sleeps + retained presentation clocks
|
||||
long transitionClickMs = -1; // --transition-click-ms <n>: force active transitions after n virtual ms
|
||||
string? histFile = null; // --trace-histogram <file>: op/call-site execution counts of the REAL run
|
||||
for (int i = 0; i < userArgs.Length; i++)
|
||||
@@ -268,7 +268,7 @@ public partial class Main : Godot.Control
|
||||
System.Collections.Generic.Dictionary<long, string>? decisions = _gfxLogPath != null || _timeline != null ? new() : null;
|
||||
int z = 0;
|
||||
var visible = _vm.Gfx.SnapshotVisibleObjects(_clock.NowMs); // one synchronized sample for objects + ranges
|
||||
foreach (var v in visible) // interpolate at the throttled clock
|
||||
foreach (var v in visible) // interpolate at the retained-presentation clock
|
||||
{
|
||||
var t = v.Transform;
|
||||
var affine = Age.Engine.Model.Transform2DMath.Build(t, v.Rotation);
|
||||
|
||||
Reference in New Issue
Block a user