Streetlab VR
Professional2026

Streetlab VR

Clinical VR tooling and mobile performance optimization for Meta Quest 3

Confidentiality notice

I signed a confidentiality agreement for this internship. This case study intentionally omits patient data, study protocols, proprietary interfaces, internal source code and confidential visuals. It only presents high-level engineering methods and representative, non-domain-specific performance measurements.

Platform
Meta Quest 3 + PC
Team
Multidisciplinary R&D team
Time
6-month end-of-study internship
Role
Unity & VR Developer
Representative performance results
< 0.1 ms
Optimized physics cost
0 B
Recurring screen-sample allocation
8 × 8
GPU-reduced analysis texture
72 / 90
Target VR frame rates
About the project

What it is

During my six-month end-of-study internship at Streetlab, an R&D company located at the heart of the Institut de la Vision in Paris, I contributed to a Meta Quest 3 application for controlled visual-perception experiments. The project combined VR locomotion, procedural environments, precise visual rendering and a companion PC interface used to operate sessions.

What I worked on

My contribution

I focused on gameplay engineering, runtime tooling and mobile VR optimization. I profiled CPU, GPU and memory bottlenecks, redesigned expensive physics checks, built an efficient screen-analysis pipeline, moved heavy telemetry work away from Unity's main thread and reduced draw calls in the procedural environment.

Key features

Main systems

  • Procedural VR environment designed for controlled locomotion scenarios.
  • Real-time PC-to-headset controls and headset telemetry over WebSockets.
  • GPU-assisted screen analysis for very small contrast variations.
  • Physics, memory and rendering optimizations validated with the Unity Profiler.
Technical deep dive

How it works

Physics optimization

From trigger storms to targeted queries

Slightly overlapping procedural paving elements caused PhysX to spend excessive time dispatching trigger events. In a representative worst-case trace, physics reached 104 ms and generated very large temporary allocations.

  • I replaced unnecessary trigger interactions with targeted Physics.OverlapBox queries for player detection.
  • I adjusted Unity's Layer Collision Matrix so floor elements no longer evaluated collisions against one another.
  • The measured physics cost fell below 0.1 ms in the optimized case.
GPU downscaling

Analyze 64 pixels instead of millions

Reading a full-resolution frame with Texture2D.GetPixels introduced a visible CPU stall and 31.6 MB of garbage per sample. I moved the reduction step to the GPU with Graphics.Blit and downscaled the image to an 8 × 8 RenderTexture before reading it back.

  • The CPU only processes 64 representative pixels after the GPU filtering pass.
  • The recurring allocation fell to 0 B and the main-thread latency disappeared from the measured path.
  • The solution preserved the precision needed for the visual validation tool without scanning the complete frame on the CPU.
Asynchronous networking

Keep telemetry away from the render loop

The headset communicates continuously with a companion PC used to control sessions and receive results. Serializing batches containing more than 900 headset samples could otherwise interrupt Unity's main thread.

  • I moved large JSON serialization and network waiting to a worker task with System.Threading.Tasks.Task.Run.
  • The headset could transmit session data without producing a visible freeze in VR.
  • Runtime controls remained responsive while telemetry was being prepared and sent.
Mobile rendering

Combine what does not need to move

The procedural street was divided into an interactive central area and a decorative peripheral area. At startup, a runtime mesh-combining tool merged static peripheral paving into a much smaller number of renderable meshes.

  • Reducing the number of separate renderers lowered draw-call pressure on the mobile GPU.
  • The combining pass restored layers and shadow settings so optimized and interactive zones remained visually consistent.
Challenges

What was difficult

The main challenge was balancing visual precision, a stable VR frame rate and continuous telemetry on mobile hardware. Every optimization had to be measured carefully so performance improvements did not change the visual conditions or the reliability of collected data.

Conclusion

What I learned

This internship taught me to go beyond code that simply works. I learned to use profiling data to reason about garbage collection, CPU-GPU transfers, multithreading and the constraints of sustained mobile VR performance in a demanding research environment.

Stack
UnityC#URPMeta Quest 3WebSocketsProfiler
Project Survivor
Next project
Project Survivor
Multiplayer online Hack'n Slash, graduation project