Prevent FIELD redraw flicker

This commit is contained in:
gamer147
2026-07-27 12:01:35 -04:00
parent b7185bbb21
commit 3e85f1083e
5 changed files with 344 additions and 86 deletions

View File

@@ -0,0 +1,74 @@
using System.Threading;
using System.Threading.Tasks;
using Age.Engine.Hosting;
using Xunit;
public class ScriptPresentationBarrierTests
{
[Fact]
public void ScriptBurstWithholdsPresentationUntilExit()
{
var barrier = new ScriptPresentationBarrier();
barrier.EnterScript();
Assert.False(barrier.TryEnterPresentation());
barrier.ExitScript();
Assert.True(barrier.TryEnterPresentation());
barrier.ExitPresentation();
}
[Fact]
public void NestedScriptsRemainOneAtomicBurst()
{
var barrier = new ScriptPresentationBarrier();
barrier.EnterScript();
barrier.EnterScript();
barrier.ExitScript();
Assert.False(barrier.TryEnterPresentation());
barrier.ExitScript();
Assert.True(barrier.TryEnterPresentation());
barrier.ExitPresentation();
}
[Fact]
public void ServiceBoundaryTemporarilyAllowsPresentation()
{
var barrier = new ScriptPresentationBarrier();
barrier.EnterScript();
bool suspended = barrier.SuspendScript();
Assert.True(suspended);
Assert.True(barrier.TryEnterPresentation());
barrier.ExitPresentation();
barrier.ResumeScript(suspended);
Assert.False(barrier.TryEnterPresentation());
barrier.ExitScript();
}
[Fact]
public async Task RenderThreadCannotEnterWhileVmThreadIsRebuilding()
{
var barrier = new ScriptPresentationBarrier();
using var entered = new ManualResetEventSlim();
using var release = new ManualResetEventSlim();
Task vmBurst = Task.Run(() =>
{
barrier.EnterScript();
entered.Set();
release.Wait();
barrier.ExitScript();
});
await Task.Run(entered.Wait);
Assert.False(barrier.TryEnterPresentation());
release.Set();
await vmBurst;
Assert.True(barrier.TryEnterPresentation());
barrier.ExitPresentation();
}
}