animation java.lang.outofmemory
-
640X480
-
OK!
Auf deiner Festplatte liegen die Bilder in einem komprimierenden Format vor. Sie werden aber zur Laufzeit im Arbeitsspeicher nicht komprimiert gespeichert. Im schlechtesten Fall brauchst du deshalb pro Bildpunkt 4 Byte Speicher.
-> Mal rechnen:
640*480*4*55 = 67584000 Byte = 64,5 MB.
Normalerweise stellt Java 64 MB Speicher zur Verfügung, also ist da schon die Grenze.
Du kannst Java beim Starten des Programms sagen, dass es mehr Speicher zur Verfügung stellen soll. Zum Besipiel so:
java -Xmx192m Programm
(Das würde 192 MB als Obergrenze setzen.)
Dabei mußt du auf die richtige Groß- und Kleinschreibung und auf Leerzeichen achten.
Vielleicht brauchst du aber garnicht so viele so große Bilder bei der Animation. Gibt es vielleicht statische Bereiche bei der Animation? Durch solche Bereiche könntest du dir Speicherplatz sparen, indem du nur für die bewegten Bereiche Bilder speicherst.
-
also ich habe das ganze in flash erstellt. und der hintergrund ist immer schwarz im vordergrund ist ein schriftzug der sich ändert. also könnte man den hintergrund statisch machen. aber dadurch müsste bei den einzelnen bildern nur die schrift abspeichert (transparent). mal schauen ob es geht.
-
also mit den parametern funktionierts.
-
also das is ja wohl wirklich nicht koscher. werden die daten nach anzeige nicht freigegeben? 192mb fürn paar sekunden, das muss nich sein.
-
Wenn das ganz einfache Bilder sind, dann kannst du sie vielleicht zur Laufzeit mit den Zeichenoperationen von Java erzeugen und garnicht speichern. Das würde natürlich mehr Rechenzeit brauchen, aber es würde deutlich weniger Arbeitsspeicher brauchen.
-
Original erstellt von Mr. N:
also das is ja wohl wirklich nicht koscher. werden die daten nach anzeige nicht freigegeben? 192mb fürn paar sekunden, das muss nich sein.Wenn das Ganze in ner Schleife läuft, dann wäre die Alternative, andauernd von der Festplatte zu laden. ...könnte man auch mal testen.
...das sollte man dann auch mal mit verschiedenen Arten des "Bild-Ladens" probieren. Angeblich gibt es da große Performanceunterschiede.
[ Dieser Beitrag wurde am 17.04.2003 um 18:58 Uhr von Gregor editiert. ]
-
hab das beispiel aus go to java2 übernommen sieht folgendermassen aus
public void run() { //Bilder laden arImg = new Image[90]; MediaTracker mt = new MediaTracker(this); Toolkit tk = getToolkit(); for (int i = 1; i <= 90; ++i) { arImg[i-1] = tk.getImage("bilder/"+i+".jpg"); mt.addImage(arImg[i-1], 0); actimage = -i; repaint(); try { mt.waitForAll(); } catch (InterruptedException e) { //nothing } } //Animation beginnen actimage = 0; while (true) { repaint(); actimage = (actimage + 1) % 90; try { Thread.sleep(100); } catch (InterruptedException e) { //nichts } } } public void paint(Graphics g) { if (actimage < 0) { g.drawString("Lade Bitmap "+(-actimage),10,50); } else { g.drawImage(arImg[actimage],10,30,this); } } }
-
...bezüglich der Performance von unterschiedlichen Möglichkeiten, Bilder zu laden, ist folgender Thread ganz interessant:
http://www.javagaming.org/cgi-bin/JGOForums/YaBB.cgi?board=2D;action=display;num=1049766490
-
danke habs mal kurz angeschaut. vielleicht würde es noch was bringen wenn ich gif's statt jpg's nehmen würde
-
hallo
ist es eigentlich auch möglich png bilder auszugeben. denn da hätte man einen transparenten hintergrund. und man könnte dan den background des panels einfach schwarz setzten.
-
Original erstellt von <png>:
**
ist es eigentlich auch möglich png bilder auszugeben. denn da hätte man einen transparenten hintergrund. und man könnte dan den background des panels einfach schwarz setzten.**Du kannst mit Java normalerweise PNGs, JPGs und GIFs laden. Allerdings wird es dir nichts bringen, wenn du einen transparenten Hintergrund hast. Auch der braucht Speicherplatz. ...genausoviel, wie ein schwarzer Hintergrund.