Topic: Sound Memory leak

Sound objekts neatbrīvo memory. Ja uzraksta šādu kodu:

var snd:Sound = new Sound();
snd.load(new URLRequest("http://5643.live.streamtheworld.com:80/SEASONAL_SC"));
snd.play();

un tad skatās RAM patēriņu, tad inicializējot tas aizņem 6MB RAM, un tad turpina augt. Es sagaidīju kad tas jau aizņem 21MBm droši vien turpina augt "bezgalīgi". Vai nav kāds buffer parametrs priekš šī te, lai ierobežotu RAM patēriņu? Man pilnīgi pietiktu ar 1MB buferi.

Re: Sound Memory leak

nekā līka te nav. Sound.load nav paredzēts mp3 strīmu ielādei.
11tajā versijā būs šāda metode:
http://help.adobe.com/en_US/FlashPlatfo … yteArray()

The Devil is definitely in the details

Re: Sound Memory leak

Izskatās, tev taisnība. Paldies.

Re: Sound Memory leak

Bet vai garbage collectoram nav jāsavāc "snd" un "ch" objekts, šādā situācijā pēc tam kad otreiz noklikšķināts uz stage ?

var snd:Sound;
var ch:SoundChannel;

stage.addEventListener(MouseEvent.CLICK, onStageClicked);

function onStageClicked(e:Event):void {
    if(snd != null) { // otrais click uz stage
        snd.close();
        ch.stop();
        snd = null
        ch = null;
        System.gc();
    } else { // pirmais click uz stage
        snd = new Sound();
        snd.load(new URLRequest("http://5643.live.streamtheworld.com:80/SEASONAL_SC"));
        ch = snd.play();
    }
}

Jo viņš to nedara. Abi objekti tā arī paliek atmiņā.

Last edited by nutshell (2011-07-30 13:45:01)

Re: Sound Memory leak

Ja mūziku nav jāpievieno dinamiski, tad pastāv viespēja ņemt talkā flexi
flexī izveidot klasi piemēram
snd extends byteArray un pašā klases kontentā ielikt embed mp3

Sintaksi no galvas neatceros, bet savulaik bija ļoti efektīvs risinājums, ļāva ekonomēt uz faila izmēru, jo šādā veidā skaņa bija iekompilēta kodā.

Re: Sound Memory leak

Okay, FP11 ir ārā, tikko cīnījos ar šo pašu problēmu bet ja ielādē datus caur loadCompressedDataFromByteArray, tad viņš man atspēlē tikai pirmo bufera izmēru. Ir kādas idejas?

import flash.utils.*;
import flash.display.*;
import flash.net.*;
import flash.events.*;

var BUFFER_SIZE:uint = 65000;

var _isPlaying:Boolean = false;
var btr:ByteArray = new ByteArray();
var snd = new Sound();
var us:URLStream = new URLStream();
us.addEventListener(ProgressEvent.PROGRESS, onProgressLoading);
us.load(new URLRequest("http://5643.live.streamtheworld.com:80/SEASONAL_SC"));

function onProgressLoading(e:Event):void {
    trace("onProgressLoading " + us.bytesAvailable)
    if(us.bytesAvailable > BUFFER_SIZE) {
        btr.clear();
        us.readBytes(btr, 0, us.bytesAvailable);
        snd.loadCompressedDataFromByteArray(btr, btr.bytesAvailable);
        if(!_isPlaying) {
            snd.play();
            _isPlaying = true;
        }
    }
}

Last edited by nutshell (2011-08-18 15:08:49)

Re: Sound Memory leak

The data will be read from the current ByteArray position and will leave the ByteArray position at the end of the specified bytes length once finished.

Pie katra progresa signāla tu iztīri baitu masīvu un raksti iekšā visus pieejamos baitus, līdz ar ko pozīcija tajā ar katru reizi izmainās uz 0.

The Devil is definitely in the details