Wie mein altes QuestâŻ2 Headset zur tĂ€glichen Sehtherapie wurde â ein persönlicher Technik-Bericht nach Metas FeatureâFreezeâŠ
Wie mein altes QuestâŻ2 Headset zur tĂ€glichen Sehtherapie wurde â ein persönlicher Technik-Bericht nach Metas FeatureâFreeze fĂŒr QuestâŻ2 und Pro
Ich saĂ an einem regnerischen Dienstagabend in meinem HomeâOffice, der Bildschirm flackerte, die Tastatur klackerte, und in der Ecke stand das QuestâŻ2âHeadset, das ich seit dem ReleaseâTag 2020 nur fĂŒr gelegentliche BeatâSaberâSessions genutzt hatte. Meta hatte gerade den FeatureâFreeze fĂŒr QuestâŻ2 und Pro angekĂŒndigt â keine neuen SystemâUpdates, keine frischen APIs, keine groĂen Ăberraschungen mehr. FĂŒr viele Entwickler war das ein Signal, das GerĂ€t in den Schrank zu verbannen. FĂŒr mich war es der Moment, in dem ich beschloss, das Headset nicht als Spielkonsole, sondern als medizinisches Werkzeug zu begreifen.
Vor drei Jahren hatte mir mein Augenarzt eine Diagnose gestellt, die ich nie erwartet hĂ€tte: Amblyopie (oft âlazy eyeâ genannt) im linken Auge, verursacht durch eine lange unbehandelte Schielstellung in der Kindheit. Die klassische Therapie â Pflaster, AugenĂŒbungen, wöchentliche Termine â hatte mich nie wirklich ĂŒberzeugt. Die Ăbungen waren monoton, die Motivation sank schnell, und die Fortschritte waren kaum messbar. Als Entwickler fragte ich mich: Kann ich die immersive Umgebung eines VRâHeadsets nutzen, um die Therapie in etwas zu verwandeln, das ich tatsĂ€chlich tĂ€glich mache?
Der FeatureâFreeze bedeutete, dass ich mich auf eine stabile, bekannte Plattform verlassen konnte. Keine ĂŒberraschenden BreakingâChanges, keine neuen PermissionâModelle, die meine kleine App alle paar Wochen kaputtmachten. Das war ein riesiger Vorteil: Ich konnte eine einmalige, deterministische BuildâPipeline aufsetzen und sie monatelang unverĂ€ndert laufen lassen. Meine Wahl fiel auf UnityâŻ2022 LTS zusammen mit OpenXR â dem offenen Standard, den Meta fĂŒr QuestâŻ2 und Pro vollstĂ€ndig unterstĂŒtzt. OpenXR gibt mir eine einheitliche Schnittstelle fĂŒr HeadâTracking, ControllerâInput und FrameâTiming, ohne dass ich mich in proprietĂ€re SDKs verbrennen muss.
Die Architektur der TherapieâApp ist bewusst schlank:
- Eine einzige UnityâScene â keine Szenenwechsel, keine Ladepausen.
-
Frameâbudget von 11âŻms (ââŻ90âŻHz) â ich messe jede FrameâTime mit
UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong()undTime.unscaledDeltaTime. Wenn ein Frame ĂŒber 11âŻms geht, wird ein kurzer LogâEintrag geschrieben. -
Deterministische Physik â
FixedUpdatelĂ€uft mit 90âŻHz, damit die visuellen Reize (kontrastreiche Gitter, bewegte Punkte) exakt synchron zum DisplayâRefresh erscheinen. -
Keine GarbageâCollectionâSpikes â ObjektâPools fĂŒr alle PartikelâSysteme,
Structâbasierte Datenstrukturen,Burstâkompilierte Jobs fĂŒr die Berechnung der AugenâBewegungen.
Ein kurzer Ausschnitt aus dem KernâLoop (C#) zeigt, wie ich die InterâPupillaryâDistance (IPD) zur Laufzeit anpasse, damit das linke Auge die therapeutische Stimulation erhĂ€lt, wĂ€hrend das rechte Auge einen neutralen Hintergrund sieht:
// OpenXRâSubsystem fĂŒr EyeâTracking (falls verfĂŒgbar)
var eyeTracking = XRGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<XREyeTrackingSubsystem>();
void FixedUpdate()
{
if (eyeTracking != null && eyeTracking.TryGetEyeGazeData(out var gaze))
{
// IPDâOffset nur fĂŒr linkes Auge anwenden
float ipdOffset = (gaze.leftEyePosition - gaze.rightEyePosition).magnitude * 0.5f;
leftEyeCamera.transform.localPosition = new Vector3(-ipdOffset, 0, 0);
}
// Therapeutische Stimuli rendern â nur linkes Auge
RenderTherapyPattern(leftEyeCamera);
RenderNeutralBackground(rightEyeCamera);
}
Der Code ist bewusst nicht auf die neuesten MetaâFeatures angewiesen â er nutzt nur das, was OpenXR seit VersionâŻ1.0 bietet. Genau das war der Grund, warum der FeatureâFreeze fĂŒr mich kein Hindernis, sondern eine Garantie fĂŒr StabilitĂ€t war.
Die ersten Wochen waren ein Experiment. Ich setzte mir ein tĂ€gliches Ziel: 20âŻMinuten morgens, bevor der erste Kaffee kochte. Die App zeigte ein hochkontrastiges GitterâMuster, das sich langsam horizontal verschob â eine klassische dichoptische Stimulation, die das schwĂ€chere Auge zwingt, die Details aufzulösen. Ich spĂŒrte, wie sich die Augenmuskeln anpassten, wie das KopfâTracking des Headsets meine Blickrichtung exakt erfasste und die Stimulation in Echtzeit anpasste. Kein externer Tracker, keine Kalibrierungssitzung â das Headset lieferte die Daten, die ich brauchte, outâofâtheâbox.
Nach vier Wochen habe ich die ersten quantitativen Messungen vorgenommen. Mit einem einfachen SnellenâTest (druckbare Tafel, 3âŻm Abstand) verbesserte sich die SehschĂ€rfe des linken Auges von 0,25âŻlogMAR auf 0,15âŻlogMAR â ein Gewinn von etwa einer Linie auf der Tafel. Die Latenz der StimulusâDarstellung lag im Median bei 7,3âŻms (gemessen ĂŒber Time.unscaledDeltaTime in der FixedUpdateâSchleife), well unter dem 11âmsâBudget. Keine FrameâDrops, keine Jitter. Die Batterielaufzeit des QuestâŻ2 reichte fĂŒr ââŻ2,5âŻStunden kontinuierlicher Nutzung â mehr als genug fĂŒr meine tĂ€gliche Routine.
NatĂŒrlich gab es RĂŒckschlĂ€ge. An einem Wochenende vergaĂ ich das Headset aufzuladen, die Sitzung fiel aus, und ich spĂŒrte, wie die Motivation sank. Ich lernte, ein festes LadeâRitual einzubauen: nach der AbendâSitzung wird das Headset sofort an die Ladestation gehĂ€ngt, ein kleiner cronâJob auf dem PiâServer schickt mir eine PushâBenachrichtigung, falls der Akku unter 30âŻ% fĂ€llt. Diese Automatisierun