Signatur
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
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
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');
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);
// Wichtig · Fallstricke
- Löscht man ein aktives Transform Feedback (zwischen
beginTransformFeedback()undendTransformFeedback()), meldet WebGLINVALID_OPERATIONund 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 erzeugtINVALID_OPERATION. Setzt Referenzen am besten aufnull. - 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.