2016-06-09 10 views
1

Ich verwende WebAudio, um Musiktitel abzuspielen. Zuerst habe ich dekodieren sie vollständig mitRichtiger Weg, Speicher von decodiertem Audiostream (mobil) zu säubern

self.ctx.decodeAudioData(xhr.response, function (buffer) { 
    this.cache = buffer; 
}) 

und den decodierten Puffer für die Zeit bis zu einem gewissen Variablen speichern, wenn ich es zu spielen beginnen müssen.

Wenn ich möchte die Spur wechseln, ich bin Reinigung der Audio-Knoten mit

node.source.onended = function (value) { 
    node.source = null; 
}; 

und den Cache mit bis:

this.cache = null;

und dekodieren den nächsten Titel auf die gleiche Variable .

Das Problem ist, wenn ich Track mehrmals schnell wechseln (wie 3-4 3min Tracks), iOS-basierten mobilen Browsern nur neu laden die Seite seit, wie es scheint, verwende ich alle verfügbaren Speicher für die Registerkarte . Während ich nur eine Puffervariable verwende, schätze ich, dass der Garbage Collector keinen Speicher von Audiopuffern freigibt, die ich nicht mehr verwende.

Irgendwelche Ideen, wie man die Implementierung verbessert?

+0

Sind Sie * sicher * haben Sie * jeden * Verweis auf den Speicher freigegeben, einschließlich des 'xhr' Objekts? Kannst du ein [mcve] machen, um das Problem zu präsentieren? –

+0

Zum Beispiel - es könnte tbh problematisch sein. Vor allem, weil ich ein separates minimalistisches Beispiel erstellen muss, das das Problem zeigt. Und es ist nicht so, dass du im Fluge tbh tun kannst. Ich werde es bis heute Abend versuchen. – North

+0

Wie für den Verweis auf Speicher - wir haben 3 von ihnen, wie ich sehe: 1. Cache - wir reinigen es 2. node.source.buffer - wir können nicht direkt löschen den Puffer, aber wir löschen die node.source Variable. Also sollte es sich um das Problem kümmern. 3. xhr Objekt. Die Anfrage erfolgt in einer privaten Funktion und xhr.response wird an self.ctx.decodeAudioData übergeben. Brauchen wir für diesen Fall zusätzliche Aufräumarbeiten? – North

Antwort

0

Wie sich herausstellte - Problem war mit dem Garbage Collector. Es dauert bis zu 20-30 Sekunden, bis der vorherige Speicher wirklich aufgeräumt ist. Also eine Lösung, die für mich funktioniert hat - ich beginne mit der Wiedergabe von Tracks und deaktiviere die Möglichkeit, für 30 Sekunden zu einem anderen Track zu wechseln. Es ist genug Zeit, um alles aufzuräumen.