2016-06-09 2 views
1

음악 트랙을 재생할 때 WebAudio를 사용하고 있습니다. 먼저 나는 완전히디코드 된 오디오 스트림 (모바일)에서 메모리를 정리하는 적절한 방법

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

그것을 디코딩하고 나는 그것을 재생을 시작해야 할 때 시간에 대한 몇 가지 변수에 디코딩 된 버퍼를 저장합니다.

내가 트랙을 전환하려는

, 나는

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

와 오디오 노드와 함께 캐시 정리하고있다 :

this.cache = null;

과 같은 변수에 다음 트랙을 디코딩 .

문제는 제가 트랙을 여러 번 전환하면 (3-4 분 3 분 트랙처럼) 빠른 연속입니다. iOS 기반 모바일 브라우저는 페이지를 다시로드하기 때문에 탭에 사용 가능한 모든 메모리를 사용하고 있습니다. . 버퍼 변수를 하나만 사용하는 동안 가비지 수집기가 더 이상 사용하지 않는 오디오 버퍼의 메모리를 확보하지 않는다고 생각합니다.

구현 방법을 개선하는 방법은 무엇입니까?

+0

'xhr' 객체를 포함하여 메모리에 대한 모든 참조가 해제 되었습니까? 문제를 선전하기 위해 [mcve]를 만들 수 있습니까? –

+0

예를 들어 - 문제가있을 수 있습니다. 주로 문제를 보여줄 별도의 최소 예를 만들어야하기 때문입니다. 그리고 그것은 당신이 파리에서 할 수있는 것이 아닙니다. 나는 오늘 저녁에 노력할 것이다. – North

+0

메모리에 대한 참조는 다음과 같습니다 : 1. 캐시 - 우리가 청소하고 있습니다 2. node.source.buffer - 버퍼를 직접 지울 수는 없지만 node.source 변수. 그래서 문제를 해결해야합니다. 3. xhr 개체입니다. 요청은 전용 함수에서 수행되고 xhr.response는 self.ctx.decodeAudioData로 전달됩니다. 이 사건에 대한 추가 정리가 필요한가요? – North

답변

0

밝혀 짐에 따라 가비지 수집기에 문제가있었습니다. 이전 메모리가 실제로 정리되는 데 20-30 초 정도 걸립니다. 나를 위해 일한 솔루션 - 트랙을 재생하고 30 초 동안 다른 트랙으로 전환하는 기능을 사용 중지합니다. 메모리가 모든 것을 정리할 충분한 시간입니다.

관련 문제