Start · Sprachen · JavaScript · Referenz · WebGL2RenderingContext.deleteTransformFeedback()

WebGL2RenderingContext.deleteTransformFeedback()

Methode

Löscht ein <code>WebGLTransformFeedback</code>-Objekt und gibt die zugehörigen GPU-Ressourcen frei.

seit JavaScript WebGL 2 – Baseline: alle modernen Browser (seit 20 Kategorie: webapi

Signatur

WebGL2RenderingContext.prototype.deleteTransformFeedback(transformFeedback)

Beschreibung

Die Methode deleteTransformFeedback() der WebGL-2-API markiert ein zuvor mit createTransformFeedback() erzeugtes WebGLTransformFeedback-Objekt zum Löschen. Transform-Feedback-Objekte speichern, welche Puffer die Ausgaben des Vertex-Shaders aufnehmen (z. B. bei GPU-Partikelsystemen oder Physiksimulationen).

Man ruft die Methode auf, wenn man das Objekt nicht mehr braucht, etwa beim Abbau einer Szene, beim Wechsel eines Effekts oder beim Aufräumen einer Komponente. So bleibt der GPU-Speicher überschaubar. Der JavaScript-Garbage-Collector räumt GPU-Ressourcen zwar irgendwann auf, aber wann das passiert, lässt sich nicht vorhersagen. Explizites Löschen ist deshalb die sauberere Lösung.

Ist das Objekt beim Aufruf gerade gebunden, setzt WebGL die Bindung auf das Standard-Transform-Feedback zurück (null). Ein aktives Transform Feedback, also eines zwischen beginTransformFeedback() und endTransformFeedback(), darf man nicht löschen. Die Puffer selbst, die an das Objekt gebunden waren, bleiben erhalten und müssen separat mit deleteBuffer() gelöscht werden.

Parameter

Name Typ Default Beschreibung
$transformFeedback Pflicht WebGLTransformFeedback | null Das zu löschende Transform-Feedback-Objekt. Bei null oder einem bereits gelöschten Objekt passiert nichts.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Transform Feedback erzeugen und wieder löschen

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');

const tf = gl.createTransformFeedback();
console.log(gl.isTransformFeedback(tf)); // false – noch nie gebunden

gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tf);
console.log(gl.isTransformFeedback(tf)); // true

gl.deleteTransformFeedback(tf);
console.log(gl.isTransformFeedback(tf)); // false
console.log(gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING)); // null
false true false null

Aufräumen eines GPU-Partikelsystems

class ParticleSystem {
  constructor(gl, count) {
    this.gl = gl;
    this.buffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
    gl.bufferData(gl.ARRAY_BUFFER, count * 4 * 4, gl.DYNAMIC_COPY);

    this.tf = gl.createTransformFeedback();
    gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, this.tf);
    gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this.buffer);
    gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
  }

  dispose() {
    const { gl } = this;
    // Zuerst sicherstellen, dass kein Transform Feedback aktiv ist
    if (gl.getParameter(gl.TRANSFORM_FEEDBACK_ACTIVE)) {
      gl.endTransformFeedback();
    }
    gl.deleteTransformFeedback(this.tf);
    gl.deleteBuffer(this.buffer); // Puffer separat freigeben
    this.tf = this.buffer = null;
  }
}

const gl = document.createElement('canvas').getContext('webgl2');
const particles = new ParticleSystem(gl, 10000);
particles.dispose();
console.log('Ressourcen freigegeben');
Ressourcen freigegeben

Sicheres Löschen mit null-Prüfung

const gl = document.createElement('canvas').getContext('webgl2');
let tf = gl.createTransformFeedback();

const release = () => {
  gl.deleteTransformFeedback(tf); // null wird stillschweigend ignoriert
  tf = null;
};

release();
release(); // zweiter Aufruf ist harmlos
console.log(gl.getError() === gl.NO_ERROR);
true

// Wichtig · Fallstricke

  • Löscht man ein aktives Transform Feedback (zwischen beginTransformFeedback() und endTransformFeedback()), meldet WebGL INVALID_OPERATION und das Objekt wird nicht gelöscht.
  • Nach dem Löschen kann das JavaScript-Objekt zwar noch existieren, verwenden lässt es sich aber nicht mehr: bindTransformFeedback() mit einem gelöschten Objekt erzeugt INVALID_OPERATION. Setzt Referenzen am besten auf null.
  • Die angehängten Puffer werden nicht mitgelöscht. Gebt sie selbst mit deleteBuffer() frei.
  • Wenn der Kontext verloren geht (webglcontextlost), sind alle Objekte ohnehin ungültig. Ein Aufruf ist dann wirkungslos.
  • Die Methode gibt es nur im WebGL2RenderingContext. WebGL 1 kennt kein Transform Feedback. Alle aktuellen Browser unterstützen die Methode, Safari seit Version 15.