Tile Wars

Status
Nicht offen für weitere Antworten.

Viper173

Mitglied
OK!

Ihr habt's ja nicht anders gewollt :)

:meld:
Memory geht hauptsächlich beim Wechsel der Menuseiten verloren. (Also Hauptseite mit HighScore nach Editor oder in den Fight Modus)

Dies geschieht auf Knopfdruck und vernichtet dann so 2 Mb!!! Was leckt bitte schön so viel Speicher???
Im Wesentlichen wird von Edit zu Hauptmenu nur das Hauptpanel sichtbar gemacht und das Editpanel unsichtbar.Selbst wenn ich bis auf die setVisible Methoden alles enferne gehen immernoch 2 Mb verloren. Es wird nichts neues erstellt. Den Program-thread habe ich auch gestoppt, immernoch Memory leak!

Eigentlich können doch nur die Hintergrund gifs soviel Speicher auf einmal ziehen, oder???
Die gifs sind auf Panels gemalt, die allerdings nur beim Start erstellt werden. Hier die Klasse des Panels:

public class DoubleBufferPanel extends Panel {
Image offscreen;
int type;

public DoubleBufferPanel(int whichone) { // login und main menu site use the same Panel Class
super();
if (whichone == 1)
type = 1;
if (whichone == 2)
type = 2;
}

/**
* null out the offscreen buffer as part of invalidation
*/
public void invalidate() {
super.invalidate();
offscreen = null;
}

/**
* override update to *not* erase the background before painting
*/
public void update(Graphics g) {
paint(g);
}

/**
* paint children into an offscreen buffer, then blast entire image
* at once.
*/
public void paint(Graphics g) {
if(offscreen == null) {
offscreen = createImage(getSize().width, getSize().height);
}

Graphics og = offscreen.getGraphics();
og.setClip(0,0,getSize().width, getSize().height);
super.paint(og);
if (pic_login != null && pic_main != null)
{
if (type == 1)
og.drawImage (pic_login, 0, 0, this.getWidth (), this.getHeight (), this);
if (type == 2)
og.drawImage (pic_main, 0, 0, this.getWidth (), this.getHeight (), this);
}
g.drawImage(offscreen, 0, 0, null);
og.dispose();
}

}


Ab und zu flush() ich alle images mal. Ist ansonsten irgendwas verkehrt an der Panel Klasse??
 

Viper173

Mitglied
Wenn ich eine neue TEdit-Klasse beim Wechsel in den Editor erstelle, muss ich dann die alte Variable/Instanz irgendwie löschen??

Ich mache auf Knopfdruck einfach:

Edit = new TEdit(this);

Edit mag aber noch von einem vorherigem Besuch des Editors nicht null sein. TEdit enthält ein haufen Zeug, wie die Panels mit den großen gifs und alles was halt im Editor so angezeigt wird. Wird bei obigem Aufruf der Speicher der zuvorigen Allocation mitsamt aller erstellten Sub-Klassen nicht vollständig wieder freigeben????
 

Oni

Top Contributor
Tip:
verwende Code-Tags, dann ist es leichter den Code zu lesen.


Lädst du die Bilder immer wieder neu?
Der Speicher läuft ja ziemlich schnell voll. Das ist meine Konsole nach ca 12 mal hin und her wechseln zwischen dem Hauptmenü und dem Editfenster.

Code:
Java Plug-in 1.6.0_04
Verwendung der JRE-Version 1.6.0_04 Java HotSpot(TM) Client VM
Home-Verzeichnis des Benutzers = C:\Dokumente und Einstellungen\


----------------------------------------------------
c:   Konsole löschen
f:   Objekte in Finalisierungswarteschlange finalisieren
g:   Speicherbereinigung
h:   Diese Hilfemeldung anzeigen
l:   ClassLoader-Liste ausgeben
m:   Speicherbelegung anzeigen
o:   Protokollierung auslösen
p:   Proxy-Konfiguration neu laden
q:   Konsole ausblenden
r:   Richtlinien-Konfiguration neu laden
s:   System- und Bereitstellungseigenschaften ausgeben
t:   Threadliste ausgeben
v:   Thread-Stack ausgeben
x:   ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------

Speicher: 14.292K  Frei: 2.410K  (16%) ... abgeschlossen.
Speicher: 30.756K  Frei: 7.045K  (22%) ... abgeschlossen.
Speicher: 40.204K  Frei: 11.336K  (28%) ... abgeschlossen.
Speicher: 61.208K  Frei: 12.312K  (20%) ... abgeschlossen.
Speicher: 65.088K  Frei: 8.785K  (13%) ... abgeschlossen.
Exception in thread "AWT-EventQueue-2" java.lang.OutOfMemoryError: Java heap space
	at java.awt.image.DataBufferInt.<init>(Unknown Source)
	at java.awt.image.Raster.createPackedRaster(Unknown Source)
	at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
	at sun.awt.Win32GraphicsConfig.createAcceleratedImage(Unknown Source)
	at sun.awt.windows.WComponentPeer.createImage(Unknown Source)
	at java.awt.Component.createImage(Unknown Source)
	at AppletFrame$DoubleBufferPanel.paint(AppletFrame.java:177)
	at sun.awt.RepaintArea.paintComponent(Unknown Source)
	at sun.awt.RepaintArea.paint(Unknown Source)
	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Speicher: 65.088K  Frei: 992K  (1%) ... abgeschlossen.

Ich kann auch nur raten, du könntest hier vielleicht mal das #flush() einbauen.
Code:
public void invalidate() {
  super.invalidate();
  offscreen.flush();
  offscreen = null;
}
 

Viper173

Mitglied
Wow, danke Oni.

War nicht ganz die Lösung, aber sie bestand auf jedem Fall in der Freigabe des "offscreen" images.

offscreen = null; hab ich jetzt statt in der invalidate der Double-Buffer-Klasse manuell bei Verlassen des Editors aufgererufen. Da versteh einer Java..... ???:L
 

Oni

Top Contributor
leider ist in den oberen rängen(level 4 aufwärts) noch nicht soviel los, du solltest nochmal ein bisschen werbung für das game machen :)
und eine möglichkeit zum nick-name ändern
 

Oni

Top Contributor
was ein bisschen ärgerlich ist.

ich habe gerade noch 15 kämpfe über, kann aber gegen niemanden mehr kämpfen, weil ich entweder im rang zu hoch bin oder schon gegen den gegner gespielt habe.
 

Oni

Top Contributor
arbeitest du eigentlich noch weiter an dem game? sind noch irgendwelche features geplant?
 

andre111

Bekanntes Mitglied
ich fänds besser wenn man iwie zwischen allen 3 kämpfen z.B 10 min warten müsste... dann kann man länger spielen =)... ansonsten super arbeit
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben