Start · Sprachen · JavaScript · Referenz · VRFrameData.timestamp

VRFrameData.timestamp

Eigenschaft

Liefert einen ständig steigenden Zeitstempel (<code>DOMHighResTimeStamp</code>) in Millisekunden, der angibt, wann das Frame-Update der <code>VRFrameData</code> erfolgte.

seit JavaScript WebVR 1.1 (veraltet, nie Baseline; ersetzt durch W deprecated seit ja Kategorie: webapi

Signatur

VRFrameData.timestamp

Beschreibung

Die schreibgeschützte Eigenschaft timestamp des Interfaces VRFrameData aus der veralteten WebVR-API enthält einen monoton steigenden Zeitwert vom Typ DOMHighResTimeStamp. Er gibt an, zu welchem Zeitpunkt die Pose- und Matrixdaten des Objekts zuletzt durch VRDisplay.getFrameData() aktualisiert wurden.

Nützlich ist der Wert vor allem, um Zeitdifferenzen zwischen zwei Frames zu berechnen, etwa für bildratenunabhängige Animationen und Physik oder um festzustellen, ob seit dem letzten Aufruf überhaupt neue Sensordaten vorliegen. Weil derselbe VRFrameData-Eintrag normalerweise bei jedem Frame wiederverwendet wird, ist der Zeitstempel die einfachste Möglichkeit, verschiedene Updates auseinanderzuhalten.

Der Wert ist eine Millisekundenangabe mit Nachkommastellen. Seine absolute Größe hat keine feste Bedeutung. Aussagekräftig sind nur Differenzen zwischen zwei Werten desselben Displays.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Ein monoton steigender Zeitstempel in Millisekunden, zu dem die Frame-Daten zuletzt aktualisiert wurden.

Beispiele

Zeitstempel des aktuellen Frames auslesen

const frameData = new VRFrameData();

const [display] = await navigator.getVRDisplays();
const onFrame = () => {
  display.getFrameData(frameData);
  console.log('Frame-Update um', frameData.timestamp.toFixed(2), 'ms');
  display.requestAnimationFrame(onFrame);
};
display.requestAnimationFrame(onFrame);
Frame-Update um 18342.57 ms

Delta-Zeit für bildratenunabhängige Animation

const frameData = new VRFrameData();
let lastTimestamp = null;
let rotation = 0;
const speed = 90; // Grad pro Sekunde

const [display] = await navigator.getVRDisplays();
const render = () => {
  display.getFrameData(frameData);
  if (lastTimestamp !== null) {
    const deltaSec = (frameData.timestamp - lastTimestamp) / 1000;
    rotation = (rotation + speed * deltaSec) % 360;
  }
  lastTimestamp = frameData.timestamp;
  // ... Szene mit rotation und frameData.pose zeichnen ...
  display.submitFrame();
  display.requestAnimationFrame(render);
};
display.requestAnimationFrame(render);

Prüfen, ob neue Sensordaten vorliegen

const frameData = new VRFrameData();
let previous = 0;

const hasNewPose = (display) => {
  display.getFrameData(frameData);
  const isNew = frameData.timestamp > previous;
  previous = frameData.timestamp;
  return isNew;
};

if ('getVRDisplays' in navigator) {
  const [display] = await navigator.getVRDisplays();
  if (display) console.log('Neue Pose:', hasNewPose(display));
} else {
  console.log('WebVR nicht verfügbar – bitte WebXR verwenden.');
}
WebVR nicht verfügbar – bitte WebXR verwenden.

// Wichtig · Fallstricke

  • Veraltet: WebVR ist obsolet und wurde von der WebXR Device API abgelöst. Dort übernimmt der time-Parameter des XRSession.requestAnimationFrame()-Callbacks diese Aufgabe (zusammen mit XRFrame).
  • Kompatibilität: Die API gab es nur in wenigen Browsern (z. B. Firefox bis Version 98, ältere Chromium-Builds hinter einem Flag, Samsung Internet, Oculus Browser). In aktuellen Browsern fehlt navigator.getVRDisplays meist ganz. Deshalb vorher per Feature-Erkennung prüfen.
  • Der Wert ist erst aussagekräftig, nachdem VRDisplay.getFrameData() aufgerufen wurde. Ein frisch erzeugtes VRFrameData-Objekt enthält noch keinen sinnvollen Zeitstempel.
  • Die Zeitbasis kann sich von Date.now() unterscheiden. Nur Differenzen zwischen Zeitstempeln derselben Quelle ergeben Sinn. Wie genau der Wert ist, kann der Browser aus Datenschutzgründen einschränken.
  • Die Eigenschaft ist schreibgeschützt. Wer ihr etwas zuweist, bewirkt nichts (im Strict Mode wirft das je nach Implementierung einen TypeError).