fix(streaming): preserve portal destination ownership
Detach old-world spatial ownership atomically, prioritize destination retirement dependencies, and reveal the viewport at the retail transition edge. Give private paperdoll views independent mesh ownership and retain dormant ACE entities so portal revisits preserve server objects without extending active GPU lifetimes.
This commit is contained in:
parent
2c848d4167
commit
823936ec31
57 changed files with 2551 additions and 324 deletions
|
|
@ -277,6 +277,7 @@ internal sealed class CompositeTextureArrayCache : IDisposable
|
|||
internal const long TargetArrayBytes = 4L * 1024 * 1024;
|
||||
internal const int MaximumLayersPerArray = 64;
|
||||
internal const int DefaultMaximumUploadsPerFrame = 16;
|
||||
internal const int DestinationRevealMaximumUploadsPerFrame = 64;
|
||||
internal const long DefaultMaximumUploadBytesPerFrame = 8L * 1024 * 1024;
|
||||
internal const int MaximumLogicalEvictionsPerFrame = 16;
|
||||
internal const int MaximumAtlasCreationsPerFrame = 1;
|
||||
|
|
@ -298,6 +299,7 @@ internal sealed class CompositeTextureArrayCache : IDisposable
|
|||
private long _frameUploadBytes;
|
||||
private int _frameAtlasCreationCount;
|
||||
private bool _uploadBudgetBlocked;
|
||||
private bool _destinationRevealUploadPriority;
|
||||
private int _pendingAtlasWidth;
|
||||
private int _pendingAtlasHeight;
|
||||
private long _pendingAtlasAllocationBytes;
|
||||
|
|
@ -390,9 +392,16 @@ internal sealed class CompositeTextureArrayCache : IDisposable
|
|||
internal long FrameUploadBytes => _frameUploadBytes;
|
||||
internal bool CanStartUpload =>
|
||||
!_uploadBudgetBlocked
|
||||
&& _frameUploadCount < _maximumUploadsPerFrame
|
||||
&& _frameUploadCount < CurrentMaximumUploadsPerFrame
|
||||
&& (_frameUploadCount == 0 || _frameUploadBytes < _maximumUploadBytesPerFrame);
|
||||
|
||||
private int CurrentMaximumUploadsPerFrame =>
|
||||
_destinationRevealUploadPriority
|
||||
? Math.Max(
|
||||
_maximumUploadsPerFrame,
|
||||
DestinationRevealMaximumUploadsPerFrame)
|
||||
: _maximumUploadsPerFrame;
|
||||
|
||||
internal Residency.ResidencyDomainSnapshot CaptureResidency()
|
||||
{
|
||||
long retiringBytes = 0;
|
||||
|
|
@ -439,7 +448,7 @@ internal sealed class CompositeTextureArrayCache : IDisposable
|
|||
internal bool CanUpload(long bytes)
|
||||
{
|
||||
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(bytes);
|
||||
if (_frameUploadCount >= _maximumUploadsPerFrame)
|
||||
if (_frameUploadCount >= CurrentMaximumUploadsPerFrame)
|
||||
return false;
|
||||
|
||||
// Always allow one item so a texture larger than the normal frame
|
||||
|
|
@ -479,10 +488,12 @@ internal sealed class CompositeTextureArrayCache : IDisposable
|
|||
return false;
|
||||
}
|
||||
|
||||
public void BeginFrame()
|
||||
public void BeginFrame(bool destinationRevealUploadPriority = false)
|
||||
{
|
||||
ThrowIfUnavailable();
|
||||
_retirementLedger.RetryPendingPublications();
|
||||
_destinationRevealUploadPriority =
|
||||
destinationRevealUploadPriority;
|
||||
_frameUploadCount = 0;
|
||||
_frameUploadBytes = 0;
|
||||
_frameAtlasCreationCount = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue