repaint() blockieren

Network

Top Contributor
Hi,

ich wusste nicht nach was ich googlen sollte, deshalb stelle ich meine frage hier:
Wie blockiere ich, dass sich das Fenster ständig repainted?
(Wenn notwendig auch Vollbild, aber mir ist aufgefallen, dass das nur ein Fenster ohne Dekoration ist)

Ich habe ein Spiel geschrieben, dort wird nach jedem durchlauf (alle 10ms) das gesammte Tile-Spielfeld zurückgesetzt (Sichtbereich) und dann neuberechnet.
Aus irgendeinem Grund jedoch aktualisiert sich das Fenster in genau diesem Prozess hin und wieder. Was passiert ist, dass das Spielfeld gezeichnet wird mit der Information das manche Bereiche als "nicht sichbar" gekennzeichnet sind - Lampen fangen an manchen Stellen an zu flackern.

Mal abgesehen, dass der Effekt sehr toll aussieht... er ist unkontrolliert.

Deshalb die Frage ob ich irgendwie das neuzeichnen entautomatisieren kann?
Ich habe bereits davon gelesen, auch in diesem Forum, aber es wurde häufig dazu gesagt, man soll es nicht tun, weshalb ich nie weitergelesen hatte oder mir irgendetwas davon gemerkt.

Vielen Dank
Gruß
Net
 

Marco13

Top Contributor
Meine Kristallkugel sagt, dass du dieses "Zurücksetzen" alle 10ms auf einem anderen Thread als dem EDT macht, und er deswegen manchmal einen Zustand zeichnet, der "halb zurückgesetzt" ist. Mehr code und infos könnten helfen.
 

Network

Top Contributor
Meine Kristallkugel sagt, dass du dieses "Zurücksetzen" alle 10ms auf einem anderen Thread als dem EDT macht, und er deswegen manchmal einen Zustand zeichnet, der "halb zurückgesetzt" ist. Mehr code und infos könnten helfen.

Kristallkugeln sind toll.
Entschuldige meine eigentliche Frage lautete ja eig. ob man irgendwie repaint entautomatisieren kann und nicht was im Code falsch ist.

Also
Java:
System.out.println( "EDT: " + SwingUtilities.isEventDispatchThread() );
liefert EDT: false

Meine Kristallkugel erzählt mir jetzt, vieleicht ist es auch nur Hirn.exe ;) dass ich keinen eigenen Thread starten sollte, sowie es bei vielen anderen Programmen eine art Pflicht darstellt.
Hilft aber leider auch nichts... Weiterhin ein flackern.
Das Codefragment von oben gibt weiterhin false zurück.

Hier der Originalcode, der alle Schritte beinhaltet, von der Main bis zum oben genannten isEventDispatcherThread-Code.
(Die Loop-Klasse ist unvollständig)

Main:
Java:
public class Main {
	
	public static void main(String[] args) {
		new Loop();
	}
}

Loop:
Java:
public class Loop /* extends Thread */ {
	
	public Loop() {
		logic = new Logic();
		
		DataInOutput datainoutput = new DataInOutput();
		Database database = new Database( datainoutput, new Editor( datainoutput ), logic );
		
		logic.setDatabase(database);
		look = new Look( logic, database );
		
		for( int i = 0; i < 10; i++ ) {
			database.setDigged(21+i, 10);
		}
		
		database.createUnit(30, 10, "Drill");
		database.createUnit(29, 10, "Constructor");
		
		run();
		//new Thread( this ).start();
	}
	public void run() {
		try {
			
			System.out.println( "EDT: " + SwingUtilities.isEventDispatchThread() );
			// "EDT: false"
			
			last = System.nanoTime();
			
			while( !logic.exit() ) {
				logic.compute();
				look.repaint();
				
				initiateDelta();
				if( delta > 0 ) Thread.sleep( delta );
				computeDelta();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.exit( 0 );
	}
}
 

Marco13

Top Contributor
Dort wird das "run" jetzt im Main-Thread ausgeführt (wie man bei sowas wie
System.out.println("Thread: "+Thread.currentThread());
auch sehen würde.

Das entscheidende ist wohl, das Zeichnen des Spielfeldes und das "zurücksetzen" (was auch immer das heißt) so zu synchronisieren, dass nicht ein halbes Spielfeld gezeichnet wird. WIE man das genau macht, kann man allgemein nicht sagen. Mit Locks/Conditions/Semaphores, synchronized, Double-Buffering (nicht beim Zeichnen, sondern bei der Berechnung) oder den "verändernden" Teil, falls möglich, auf dem EDT machen lassen.
 

Michael...

Top Contributor

Network

Top Contributor
@Marco13
Leider würde ein Posten des Codes den Rahmen hier sprengen, wobei deine Stichworte sehr gute Ansätze sind die sehr weiterhelfen.

Selbstverständlich habe ich mir auch eigene Gedanken gemacht, jedoch mit dem jetzigen Programmaufbau/Referenzen hat jedes Objekt nur die Referenz auf sein an der selben Position liegendes Tile. Und dieses wiederum die Referenz auf die 8 Nachbartiles.
Natürlich könnte man sich jetzt von Tile zu Tile durchcrawlen, was aber in zigtausend Methodenaufrufen enden kann. Performanceängste hab ich da.

@Michael...
Ok vielen Dank, genau das hatte ich gesucht. Perfekt Danke.
Ein KSKB ist denke ich nicht nötig.
Active Rendering ist auch nicht (mehr) direkt notwendig.
Jetzt muss ich natürlich abwägen ob ich mir Marco13s Tipps zu herzen nehme und diese umsetze - was natürlich dann später bei der Ersetzung durch eine OpenGL-Visualisierungs-Klasse Probleme machen könnte.
Oder es mit ActiveRendering aufnehme und all seinen Nachteilen (Obwohl ich keine wirklich sehen konnte in dem hilfreichen Link).
Das wird aber das kleinste Problem sein.

Ich danke nochmals
mit freundlichen Grüßen
Net
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Jetzt muss ich natürlich abwägen ob ich mir Marco13s Tipps zu herzen nehme und diese umsetze - was natürlich dann später bei der Ersetzung durch eine OpenGL-Visualisierungs-Klasse Probleme machen könnte.

Welche Tipps meinst du genau? Bei OpenGL ist es fast noch wichtiger, dass alles auf dem richtigen Thread passiert, aber der konzeptuelle Unterschied zu Swing ist so groß, dass man sich für eine Infrastruktur, die "wahlweise" eine von beiden Visualisierungen unterstützt schon sehr genau die möglichen Ansätze überlegen sollte...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben