repaint() zu langsam, bitte um alternativen

apokryphus

Mitglied
liebe community,

dies ist mein erster post und ich möchte alle, verbunden mit meiner anfrage, grüßen.

folgender code (wiiremotej-bibliothek auf ubuntu 9.10 mit java-6-sun-1.6.0.15) führt dazu, dass beim gleichzeitigen betrachten der ausgaben, delays von gut einer halben sekunde zwischen dem bewegen der wiiremote und der ausgabe auftreten. kann mir bitte jemand dabei helfen die performance zu verbessern?
Java:
import java.awt.*;
import javax.swing.*;

import wiiremotej.*;
import wiiremotej.event.*;

import javax.sound.sampled.*;
import java.io.*;


public class WiiConnect extends WiiRemoteAdapter{
    public WiiConnect(WiiRemote remote)
    {
      this.remote = remote;
    }
    private static boolean accelerometerSource = true; //true = wii remote, false = nunchuk
    private static boolean lastSource = true;
    
    
    private WiiRemote remote;

    private static JFrame graphFrame;
    private static JFrame irFrame;
    private static JPanel graph;
    private static JPanel irVision;
    private static int[][] pixels;
    private static int t = 0;
    private static int x = 0;
    private static int y = 0;
    private static int z = 0;
    
    private static int lastX = 0;
    private static int lastY = 0;
    private static int lastZ = 0;

    private static int pos1x = 0;
    private static int pos1y = 0;
    private static int pos2x = 0;
    private static int pos2y= 0;
    
	public static void main(String args[]){
		System.setProperty("bluecove.jsr82.psm_minimum_off", "true");

		try{
			
		    graphFrame = new JFrame();
		    graphFrame.setTitle("Accelerometer graph: Wii Remote");
		    graphFrame.setSize(800, 600);
		    graphFrame.setResizable(false);
		    
		    t = 801;
		    pixels = new int[800][600];
		    graph = new JPanel(){
		        public void paintComponent(Graphics graphics)
		        {
		            if (t >= 800 || accelerometerSource != lastSource)
		            {
		                t = 0;
		                lastSource = accelerometerSource;
		                graphics.clearRect(0, 0, 800, 600);
		                graphics.fillRect(0, 0, 800, 600);
		                graphics.setColor(Color.WHITE);
		                graphics.drawLine(0, 300, 800, 300);
		            }
		            
		            graphics.setColor(Color.RED);
		            graphics.drawLine(t, lastX, t, x);
		            graphics.setColor(Color.GREEN);
		            graphics.drawLine(t, lastY, t, y);
		            graphics.setColor(Color.BLUE);
		            graphics.drawLine(t, lastZ, t, z);
		        }
		    };
		    graphFrame.add(graph);
		    graphFrame.setVisible(true);
		    
			}catch(Exception e){
				System.out.println("Fehler bei Draw!");
			}
		
		try{
			
		    irFrame = new JFrame();
		    irFrame.setTitle("IR-Vision: Wii Remote");
		    irFrame.setSize(400, 400);
		    irFrame.setResizable(false);
		    

		    irVision = new JPanel(){
		        public void paintComponent(Graphics graphics)
		        {
	                graphics.clearRect(0, 0, 400, 400);
	                graphics.fillRect(0, 0, 400, 400);
		            graphics.setColor(Color.WHITE);
		            graphics.drawOval(pos1x, pos1y, 10, 10);
		            graphics.drawOval(pos2x, pos2y, 10, 10);
		        }
		    };
		    irFrame.add(irVision);
		    irFrame.setVisible(true);
		    
			}catch(Exception e){
				System.out.println("Fehler bei Draw!");
			}
			
		try {
				WiiRemote remote = WiiRemoteJ.findRemote();
				System.out.println(remote.getBluetoothAddress());
	            remote.setAccelerometerEnabled(true);
	            remote.setIRSensorEnabled(true,1);
	            remote.addWiiRemoteListener(new WiiConnect(remote));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			

	}
	   

    
	public void accelerationInputReceived(WRAccelerationEvent evt)
    {
        //System.out.println("R: " + evt.getRoll());
        //System.out.println("P: " + evt.getPitch());
        if (accelerometerSource)
        {
            lastX = x;
            lastY = y;
            lastZ = z;
            
            x = (int)(evt.getXAcceleration()/5*300)+300;
            y = (int)(evt.getYAcceleration()/5*300)+300;
            z = (int)(evt.getZAcceleration()/5*300)+300;
            
            t++;

            graph.repaint();
        }
    }

    public void IRInputReceived(WRIREvent evt)
    {  
       if((evt.getIRLights()[0] != null) && (evt.getIRLights()[1] !=null)){

	        pos1x = (int) (evt.getIRLights()[0].getX()*100+140);
	        pos1y = (int) (evt.getIRLights()[0].getY()*100+140);
	        pos2x = (int) (evt.getIRLights()[1].getX()*100+140);
	        pos2y = (int) (evt.getIRLights()[1].getY()*100+140);
			
	    	irVision.repaint();
	    
       }	
       
    }
}
 

Verjigorm

Top Contributor
anstatt
Code:
graphics.clearRect(0, 0, 400, 400);
graphics.fillRect(0, 0, 400, 400);
aufzurufen sollte man imho
Code:
 super.paintComponent(graphics);
aufrufen.

Aber weiss nicht, ob es was bringt.
Testen kann man leider nichts
 
Zuletzt bearbeitet:
S

SlaterB

Gast
kommen die Daten überhaupt schnell genug an, funktioniert das Programm wenn du ohne GUI nur mit System.out.println() arbeitest?
zumindest eine Links<->Rechts-Bewegung könnte man damit doch testen

Ausgabe
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
xxxxxxxx
xx
xxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
usw ;)
 

apokryphus

Mitglied
Hallo,

also die Daten kommen schon schnell genug an, wenn ich ein Fenster schließe, dann wird nach kurzer Zeit die Visualisierung zeitnah umgesetzt. Das Lag verschwindet also.

Liegt es an meinem Rechner (Asus 1201n) oder ist der Eventlistener einfach überlastet?

Die G-Sensoren arbeiten mit 100Hz und der BluetoothStack scheint so gesehen auch in Ordnung, da ja ein Fesnter allein adäquat dargestellt wird.

@Slater: Ich versteh leider deinen Hinweiß nicht ganz: Muss ich die beiden Instanzen des Panels nicht getrennt bearbeiten?
 
S

SlaterB

Gast
> Muss ich die beiden Instanzen des Panels nicht getrennt bearbeiten?

ich hatte dir vorgeschlagen, überhaupt keine Panel oder GUIs zu verwenden,
sondern nur einen WiiRemoteAdapter, der aus den Events bisschen x,y ausrechnet
und diese Information per System.out.println() ganz simpel visualisiert
(-> wenn das auch verzögert, dann ist das Problem noch nicht gelöst, aber hat zumindest nichts mit der GUI zu tun)

aber du schriebst ja jetzt, dass die Daten schnell genug ankommen, wenn du dir da sicher bist, dann mag es so sein

-----

ich habe weder Wii noch die API um das zu testen,
man könnte sich den Spass machen und stattdessen eine Dummy-Datenquelle bauen, die als eigener Thread läuft und im Verlauf von ein paar Sekunden die passenden Daten liefert um eine Bewegung anzuzeigen,
dann könnte jeder testen wie schnell das ankommt, wie schnell die GUI reagiert usw.,
noch wär mir das zuviel Aufwand, aber wenn du das machen willst oder der Thread noch eine Weile dauert wär das schon interessant ;)
 

apokryphus

Mitglied
> Muss ich die beiden Instanzen des Panels nicht getrennt bearbeiten?

ich hatte dir vorgeschlagen, überhaupt keine Panel oder GUIs zu verwenden,

Sorry, mein Fehler, das ging eigentlich an Verjigorm...

Also ja, ich denke, dass die Daten schnell genug ankommen. Könnte es sein, dass die G-Sensordaten und die der IR-Events die Bandbreite überlasten, bzw. das System träge machen?
Ich bin allerdings auch eher ein Anfänger in den Dingen. ;)

Grundsätzlich wäre ein Testthread glaube ich nicht schwer, da einfach nur beliebige doubles zwischen -1 und 1 für die drei G-Sensoren sowie doubles zwischen 0,1 für die IR-Lights ankommen müssten.

Danke euch beiden!
 
Zuletzt bearbeitet:
Ä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
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
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
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