Kitöltés ByteArray ActionScript 3 segítségével

szavazat
72

Hogyan erőszakkal kirak egy ByteArraymemóriából ActionScript 3 segítségével?

Megpróbáltam a következő:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
A kérdést 01/08/2008 13:30
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
15

Akkor nézd meg ezt a cikket

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

IANA actionscript programozó, de az érzés, kapok az, hogy mivel a szemétgyűjtő esetleg nem fut, ha azt akarjuk, hogy.

Ezért http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Tehát én azt javasolnám, hogy kipróbálja a gyűjtőkódot, hátha ez segít

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}
Válaszolt 01/08/2008 14:08
a forrás felhasználó

szavazat
19

(Nem vagyok biztos ebben, de ...)

AS3, amely nem-determinisztikus szemétgyűjtés. Ami azt jelenti, hogy a hivatkozás nélküli memória felszabadul, amikor a futási úgy érzi, hogy (általában nem, ha van egy ok arra, hogy futni, mivel ez egy drága művelet végrehajtható). Ez ugyanaz a megközelítés által alkalmazott legmodernebb szemetet gyűjtött nyelvek (például a C # és Java is).

Feltételezve, hogy nincs más utalás a memória által mutatott byteArrayvagy az egyes elemeknek a tömböt, akkor a memória felszabadul egy bizonyos ponton, miután kilép körét, ahol byteArraymegállapították.

Rá lehet kényszeríteni egy szemétgyűjtő, de akkor tényleg nem kellene. Ha igen, akkor azt csak tesztelésre ... ha ez a termelés, akkor fáj a teljesítmény sokkal több, mint segíteni.

Kényszeríteni egy GC, próbálja (igen, kétszer):

flash.system.System.gc();
flash.system.System.gc();

Akkor tovább itt .

Válaszolt 01/08/2008 14:08
a forrás felhasználó

szavazat
13

Sajnos, amikor a memória kezelése a Flash / actionscript nincs egy csomó, amit tehetünk. ActionScript úgy tervezték, hogy könnyen használható (így nem akarnak az emberek nem kell aggódnia, a memória kezelése)

A következő egy megoldás létrehozása helyett egy ByteArrayváltozó próbálja meg ezt.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

Amennyiben byteArrayegy dinamikus tulajdonsága byteObject, akkor szabad a memória különítettek el rá.

Válaszolt 01/08/2008 14:14
a forrás felhasználó

szavazat
13

Azt hiszem, megválaszolta a saját kérdését ...

System.totalMemorymegadja a teljes memória mennyiségét „használt”, nincs hozzárendelve. Ez pontos, hogy az alkalmazás csak akkor használja 20MB, de van 5 MB, amely mentes a jövőbeni juttatások.

Nem vagyok benne biztos, ha az Adobe docs fényt derített volna az is, hogy kezeli a memóriát ...

Válaszolt 01/08/2008 15:03
a forrás felhasználó

szavazat
29

Nem hiszem, hogy van valami aggódni. Ha System.totalMemorylemegy pihenhet. Ez nagyon jól lehet az operációs rendszer nem vissza az újonnan felszabadított memóriát (megelőlegezve a következő alkalommal Flash Player kér több memóriát).

Próbálj meg valami mást, ami rendkívül sok memória és biztos vagyok benne, hogy észre fogod venni, hogy a lefoglalt memória Flash Player csökkenni fog, és lehet használni a többi folyamat helyett.

Mint már értette, memória kezelése a modern operációs rendszer nem intuitív szemszögéből nézi a kiutalt összegeket minden egyes folyamat, vagy akár a teljes összeget különítettek el.

Amikor én is használtam a Mac 5 percig 95% az én 3 GB RAM használnak, és ez így is fog maradni, soha nem megy le. Ez már csak így az operációs rendszer kezeli a memóriát.

Mindaddig, amíg nincs rá szükség, máshol még folyamatok kilép még memóriát a számukra kijelölt (ez teszi őket elindítani gyorsabb a következő alkalommal, például).

Válaszolt 14/08/2008 18:05
a forrás felhasználó

szavazat
9

Tehát, ha azt mondjuk betölteni 20MB MySQL, a Task Manager a RAM alkalmazása felmegy kb 25MB. Aztán amikor a kapcsolatot, és próbálja, hogy dobja a ByteArray, a RAM nem szabadít fel. Azonban, ha azt használja System.totalMemory, flash player azt mutatja, hogy a memória is megjelent, ami nem ez a helyzet.

A flash player csinál valamit, mint a Java, és foglaljon helyet kupac, és nem oldja azt, amíg az alkalmazás kilép?

Hát igen és nem, mivel elképzelhető, hogy olvasni számtalan blogbejegyzéseinket a GC AVM2 optimista, és működni fog ez a saját rejtélyes módon. Tehát ez nem egy kicsit dolgozni, mint a Java, és megpróbálja foglalni a kupac, de ha hagyjuk, hogy elég hosszú, és indítsa el, hogy további műveleteket, amelyek fogyaszt jelentős memóriát szabadít hogy a korábbi helyet. Láthatjuk ezt a profiler éjszakán át néhány tesztet tetején futó az alkalmazásban.

Válaszolt 17/09/2008 11:09
a forrás felhasználó

szavazat
7

Tehát, ha azt mondjuk betölteni 20MB MySQL, a Task Manager a RAM alkalmazása felmegy kb 25MB. Aztán amikor a kapcsolatot, és próbálja, hogy dobja a ByteArray, a RAM nem szabadít fel. Azonban, ha azt használja System.totalMemory, flash player azt mutatja, hogy a memória is megjelent, ami nem ez a helyzet.

A játékos „felszabadító” a memóriát. Ha kis méretűre az ablakot, és visszaállítani meg kell látni, hogy az emlékezés most sokkal közelebb, amit System.totalMemory mutatja.

Ön is érdekelt a FlexBuilder a profilalkotás eszközöket, amelyek meg tudja mutatni, ha tényleg szükség van memóriavesztés.

Válaszolt 06/10/2008 19:16
a forrás felhasználó


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more