Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-02-2011, 11:17   #1 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
Bitmap, BitmapData, onEnterFrame und der Speicher

Hi,

ich habe ein kleines Script gemacht, dass die Spuren von ein paar Vektor Sprites auf der Bühne verfolgt. Bei jeder Iteration wird die stage abfotografiert und das Foto wieder in den Hintergrund gelegt. Dadurch ergeben sich Bewegungspfade der Sprites.

Mein Problem ist jetzt, dass die Speicherauslastung zu rucklern führt, aber nicht, weil der Speicher irgendwann dicht ist, sondern weil er dicht gemacht wird, sich dann aber wieder entleert. Dieses entleeren sorgt für die Ruckler. Für mich sieht das nach einem Problem der System.gc() aus. Ich versteh allerdings auch nicht, wie das sein kann. Ich überschreib doch das Bitmap immer wieder?

Script sieht so aus:

Code:
		private function drawer (ev:Event = null):void {
			var bmpneu : BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x00555555);
			bmpneu.draw(stage);
			var bneu:Bitmap = new Bitmap(bmpneu);
			var tempSprite : Sprite = new Sprite();
			
			tempSprite.addChild(bneu);
			_mySprite.addChild(tempSprite);
			
			if (iterationvar > 0) {
				var ref:Sprite = _mySprite.getChildAt(0) as Sprite;
				_mySprite.removeChildAt(0);
				ref = null;
				System.gc();
				
			}else {
				iterationvar++;
			}
			
		}
Weiß jemand, wo da das Problem liegt?
Danke
echo
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 11-02-2011, 11:47   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Find die ganze Konstruktion etwas seltsam. Jedes mal neue Instanzen zu erzeugen und dan per getChildAt(0) zu entfernen ist jedenfalls nicht wirklich ressourcenschonend.

Wieso benutzt Du nicht einfach nur 1 BitmapData, dass Du bei Event.ENTER_FRAME einfach leerst und dann die Bühne hineinzeichnest? Die ganze Instanzen-Erzeuger- und Austauscherei wird damit überflüssig!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 11-02-2011, 12:25   #3 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
Du meinst Bitmap.bitmapData = bitmapdata.draw(stage);
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 11-02-2011, 12:59   #4 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von echo5-7 Beitrag anzeigen
Du meinst Bitmap.bitmapData = bitmapdata.draw(stage);
Das kann so leider nicht funktionieren, weil draw keinen Rückgabewert hat.

Versuch's mal so:
PHP-Code:
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.IBitmapDrawable;

//...

private var bmpData:BitmapData;
private var 
bmp:Bitmap;
private var 
bmpSource:IBitmapDrawable;

//...

private function init():void {
    
bmpSource stage;
    
bmpData = new BitmapData(stage.stageWidthstage.stageHeightfalse0x00555555);
    
bmp = new Bitmap(bmpData);
    
addChild(bmp);

    
drawBmp();
}

//...

private function drawBmp (ev:Event null):void {
    
bmpData.fillRect(bmpData.rect0x00555555);
    
bmpData.draw(bmpSource);

__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 11-02-2011, 19:10   #5 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.496
hi,

martins code funktioniert so tadellos. nur ein kleiner nachtrag zum verständnis:

der speicher läuft dir voll, weil bitmapdata nicht wie instanzen anderer klassen einfach in der gc landen. die müssen von hand mit dispose() zuvor entleert werden.

mfg

sx
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 11-02-2011, 21:33   #6 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
jungs, ihr seid klasse! das mit dem dispose muss man auch erstmal wissen. der code funktionert, ich hab nur das fillRect rausgenommen, weil sonst das bmp jedesmal zurück setzt.

nur zum abschließenden verständnis: was macht das IBitmapDrawable jetzt genau? Die Lifedocs geben mir dazu nur das hier aus

Zitat:
Die IBitmapDrawable-Schnittstelle wird von Objekten implementiert, die als source-Parameter der draw()-Methode der BitmapData-Klasse übergeben werden können. Diese Objekt sind vom Typ „BitmapData“ oder „DisplayObject“.
Versteh ich das richtig, dass sobald man ein Object als Source für Ibitmapdrawable definiert, das objekt als pixeldaten im speicher vorbehalten wird, und bei bedarf abgerufen werden kann?

danke
echo
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 12-02-2011, 15:15   #7 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
Versteh ich das richtig, dass sobald man ein Object als Source für Ibitmapdrawable definiert, das objekt als pixeldaten im speicher vorbehalten wird, und bei bedarf abgerufen werden kann?
nein, die Bilddaten des BitmapData-Objektes liegen im Speicher unkompriomiert vor.


die IBitmapDrawable-Schnittstelle ist keine Schnittstelle in der eigentlichen Bedeutung, sondern sowas wie ein Marker, um die Parameter Typsicher zu machen.
IBitmapDrawable beinhaltet alle DisplayObjekte und BitmapData.
Das Interface wird verwendet um BitmapData und DisplayObject in einer gemeinsamen Gruppe zusammenfassen zu können.


noch ne kleine Rechnung, um dir zu zeigen, wieso dir dein Speicher vollgelaufen ist:
speicherVerbrauch für ein BitmapData-Objekt
speicherVerbrauch = (bmd.width*bmd.height)pixel *32Bit/pixel * 1Byte/8Bit
bei 640*480 Pixel sind das 1228800 Byte oder 1,17MB (pro BitmapData)
und wenn du das 25x pro Sekunde machst, kommst du auf ~30MB/Sekunde die du erzeugst, und die die GC wieder fortschaffen muss.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 13-02-2011, 12:43   #8 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
super! danke!
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
bitmap aus library laden & bitmapdata dabinjo ActionScript 3 4 11-03-2009 16:25
bitmapdata speicher problem kakktus ActionScript 3 3 25-02-2009 14:43
new BitmapData(...) macht Speicher voll? Perpetuum ActionScript 3 4 10-12-2008 00:14
BitmapData -> Bitmap Font Table... Zett Flash 8 1 17-12-2006 17:44
externes Bitmap in BitmapData laden jmora Flash 8 5 06-05-2006 16:36


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele