streaming: far LODs keep a share while near work is pending (L79); no more horizon starvation

L78's strict near-first order starved far LODs at 30 m/s (100% far holes, never completed).
Unreal policy 2: once the collision ring is ready, LOD0-2 keep their reserve and far tiles are
admitted as low-priority Horizon work; headless gives far work 1 of every 16 requests.
Moving camera, far holes while moving: 1.4 m/s L77 8% / L78 29% / L79 31%; 30 m/s L77 8% /
L78 100% / L79 72% (completes on dwell). Near readiness while moving at 30 m/s: 52 / 51 / 67%.
Still worse than L77 for fast travel -> speed-adaptive policy next. World unchanged (v213).
Fast tier PASS; Linux UE host builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-27 20:17:35 +01:00
1 parent ec20994a8e
commit 2c8a26c0d0
11 files changed
+833 -30

No files matched your search

+46 -1
View File
@@ -86,6 +86,11 @@ namespace
bool HasCameraStep=false;
bool AutoSurfaceCamera=false;
bool CaptureSkipWalkability=false;
int StreamingSchedulerPolicy=-1;
bool MovingCameraTrace=false;
double MovingCameraSpeedMetersPerSecond=0.0;
double MovingCameraDurationSeconds=12.0;
double MovingCameraDwellSeconds=5.0;
FVector CameraMeters=FVector::ZeroVector;
FVector CameraStepMeters=FVector::ZeroVector;
float CameraYawDegrees=0.0f;
@@ -1409,6 +1414,8 @@ namespace
std::printf("Usage: %s [owner_world.json] --world-assembler-prototype --stream-benchmark --stream-pipeline [options]\n"
" --workers=N --clip-radius=N --max-clip-level=N --max-level=N\n"
" --camera=X,Y,Z,YAW,PITCH (position in metres) --stream-hash\n"
" --stream-scheduler-policy=0|1|2 (L77 coarse, L78 near, L79 fair share)\n"
" --moving-camera-speed-mps=N [--moving-camera-duration-s=N] [--moving-camera-dwell-s=N]\n"
" --stream-hash-tiles (print per-tile hashes; implies --stream-hash)\n"
" --stream-hash-tiles-allow-skips (mesh/topology falsifier with proven uniform skips)\n"
" --camera-step=X,Y,Z (optional second view step in metres)\n"
@@ -1590,6 +1597,37 @@ namespace
{std::fprintf(stderr,"Invalid --camera-step value: %.*s\n",static_cast<int>(arg.size()),arg.data());return false;}
options.HasCameraStep=true;
}
else if(arg.starts_with("--stream-scheduler-policy="))
{
if(!readInt("--stream-scheduler-policy=",options.StreamingSchedulerPolicy)
||options.StreamingSchedulerPolicy<0||options.StreamingSchedulerPolicy>2)
{std::fprintf(stderr,"Invalid --stream-scheduler-policy (expected 0..2).\n");return false;}
}
else if(arg.starts_with("--moving-camera-speed-mps="))
{
const std::string value(arg.substr(std::string_view("--moving-camera-speed-mps=").size()));
char* end=nullptr;options.MovingCameraSpeedMetersPerSecond=std::strtod(value.c_str(),&end);
if(end==value.c_str()||*end!='\0'||!std::isfinite(options.MovingCameraSpeedMetersPerSecond)
||options.MovingCameraSpeedMetersPerSecond<=0.0)
{std::fprintf(stderr,"Invalid --moving-camera-speed-mps (expected positive finite value).\n");return false;}
options.MovingCameraTrace=true;
}
else if(arg.starts_with("--moving-camera-duration-s="))
{
const std::string value(arg.substr(std::string_view("--moving-camera-duration-s=").size()));
char* end=nullptr;options.MovingCameraDurationSeconds=std::strtod(value.c_str(),&end);
if(end==value.c_str()||*end!='\0'||!std::isfinite(options.MovingCameraDurationSeconds)
||options.MovingCameraDurationSeconds<=0.0)
{std::fprintf(stderr,"Invalid --moving-camera-duration-s (expected positive finite value).\n");return false;}
}
else if(arg.starts_with("--moving-camera-dwell-s="))
{
const std::string value(arg.substr(std::string_view("--moving-camera-dwell-s=").size()));
char* end=nullptr;options.MovingCameraDwellSeconds=std::strtod(value.c_str(),&end);
if(end==value.c_str()||*end!='\0'||!std::isfinite(options.MovingCameraDwellSeconds)
||options.MovingCameraDwellSeconds<0.0)
{std::fprintf(stderr,"Invalid --moving-camera-dwell-s (expected nonnegative finite value).\n");return false;}
}
else if(arg.starts_with("--column-cache="))
{
const std::string_view mode=arg.substr(std::string_view("--column-cache=").size());
@@ -1635,6 +1673,10 @@ namespace
{std::fprintf(stderr,"--tls-probe-touch requires --tls-probe=N\n");return false;}
if(options.RegionCrossing&&!options.HasCameraStep)
{std::fprintf(stderr,"--region-crossing requires --camera-step=X,Y,Z\n");return false;}
if(options.MovingCameraTrace&&(!options.StreamPipeline||!options.WorldAssemblerPrototype))
{std::fprintf(stderr,"--moving-camera-speed-mps requires --world-assembler-prototype --stream-pipeline\n");return false;}
if(options.MovingCameraTrace&&options.StreamingSchedulerPolicy<0)
{std::fprintf(stderr,"--moving-camera-speed-mps requires --stream-scheduler-policy=0|1|2\n");return false;}
if(options.LandmarkL45RampControl&&!options.LandmarkChamberDemo)
{std::fprintf(stderr,"--landmark-l45-ramp-control requires --landmark-chamber-demo\n");return false;}
if(options.AuditOreVeinYield&&!options.OreVeinsDemo)
@@ -2228,5 +2270,8 @@ int main(int argc,char** argv)
?options.ParallelSignEdgeRepair:options.FloatingIslandsRecipe,
options.AuditNativeLattice,options.LatticeOrphanControl,
options.CaptureSkipWalkability,options.ProfilePassageComposer,
options.StreamHashAllowUniformSkips,options.Linux77Profile);
options.StreamHashAllowUniformSkips,options.Linux77Profile,
options.StreamingSchedulerPolicy,options.MovingCameraTrace,
options.MovingCameraSpeedMetersPerSecond,options.MovingCameraDurationSeconds,
options.MovingCameraDwellSeconds);
}