Prefetch nearby scene assets in the background
This commit is contained in:
@@ -111,6 +111,13 @@ async fn live_bevy_capture_renders_in_front_of_avatar() -> Result<(), Box<dyn Er
|
||||
let renderer_owner = LibremetaverseClientOwner::new()?;
|
||||
let (mut renderer_session, renderer_cancel) =
|
||||
login(&renderer_owner, &environment, "GRID_USER", "GRID_PASSWORD").await?;
|
||||
let limits = VisionLimits {
|
||||
minimum_interval: Duration::ZERO,
|
||||
..VisionLimits::default()
|
||||
};
|
||||
let scene_source = Arc::new(LibremetaverseSceneSource::new(&renderer_owner, limits));
|
||||
let prefetch_started = Instant::now();
|
||||
scene_source.start_prefetch();
|
||||
|
||||
let result = async {
|
||||
wait_ready("renderer", &mut renderer_session, &renderer_cancel).await?;
|
||||
@@ -143,17 +150,26 @@ async fn live_bevy_capture_renders_in_front_of_avatar() -> Result<(), Box<dyn Er
|
||||
.camera
|
||||
.set_vertical_fov_angle(65_f32.to_radians())?;
|
||||
|
||||
let limits = VisionLimits {
|
||||
minimum_interval: Duration::ZERO,
|
||||
..VisionLimits::default()
|
||||
};
|
||||
tokio::time::timeout(Duration::from_mins(10), async {
|
||||
while scene_source.prefetch_passes() == 0 {
|
||||
tokio::time::sleep(Duration::from_millis(250)).await;
|
||||
}
|
||||
})
|
||||
.await
|
||||
.map_err(|_| "background scene prefetch did not complete")?;
|
||||
println!(
|
||||
"LIVE_RENDER_PREFETCH_MILLISECONDS={}",
|
||||
prefetch_started.elapsed().as_millis()
|
||||
);
|
||||
scene_source.stop_prefetch().await;
|
||||
|
||||
println!(
|
||||
"LIVE_RENDER_SCOPE=max_distance_meters:{}",
|
||||
limits.max_distance_meters
|
||||
);
|
||||
let vision = VisionService::new(
|
||||
Arc::new(DiagnosticSceneSource {
|
||||
inner: LibremetaverseSceneSource::new(&renderer_owner, limits),
|
||||
inner: Arc::clone(&scene_source),
|
||||
material_override: std::env::var("METACRATE_LIVE_RENDER_MATERIAL_OVERRIDE").ok(),
|
||||
}),
|
||||
limits,
|
||||
@@ -173,6 +189,7 @@ async fn live_bevy_capture_renders_in_front_of_avatar() -> Result<(), Box<dyn Er
|
||||
let mut previous_missing = u32::MAX;
|
||||
let mut stable_missing = 0_u32;
|
||||
for frame in 1..=frames {
|
||||
let frame_started = Instant::now();
|
||||
let next = vision
|
||||
.capture(
|
||||
&format!("live-renderer-evidence-{frame}"),
|
||||
@@ -180,6 +197,10 @@ async fn live_bevy_capture_renders_in_front_of_avatar() -> Result<(), Box<dyn Er
|
||||
renderer_cancel.token(),
|
||||
)
|
||||
.await?;
|
||||
println!(
|
||||
"LIVE_RENDER_FRAME_{frame}_MILLISECONDS={}",
|
||||
frame_started.elapsed().as_millis()
|
||||
);
|
||||
println!("LIVE_RENDER_FRAME_{frame}_SUMMARY={}", next.summary);
|
||||
std::fs::write(&output, &next.jpeg)?;
|
||||
if next.completeness.textures_missing == previous_missing {
|
||||
@@ -200,12 +221,13 @@ async fn live_bevy_capture_renders_in_front_of_avatar() -> Result<(), Box<dyn Er
|
||||
}
|
||||
.await;
|
||||
|
||||
scene_source.stop_prefetch().await;
|
||||
let _ = renderer_session.logout(renderer_cancel.token()).await;
|
||||
result
|
||||
}
|
||||
|
||||
struct DiagnosticSceneSource {
|
||||
inner: LibremetaverseSceneSource,
|
||||
inner: Arc<LibremetaverseSceneSource>,
|
||||
material_override: Option<String>,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user