# Probleme mit UDP



## RobDom (2. Mrz 2008)

Hallo zusammen,

ich hab ein Performance Problem mit UDP.

Hab zu diesem Thema im Zusammenhang mit java3D letztes Jahr schon mal was gepostet,
bin aber leider immer noch zu keinem Ergebnis gekommen.

Ich hab zwei Klassen data, receive. Eigentlich ganz simple: receive Liest Daten ein,
data schreibt sie auf die Konsole. Soweit so gut. 

Mein Problem: Das ganze wird langsamer und wieder schneller!!!
Man kann also in der Konsole sehen, die Zeilen mit den Daten laufen erst schnell
und dann immer langsamer, dann wieder schneller und so weiter. Sieht so aus als ob
ein Speicher voll läuft, o.ä. Das ganze wird später für mich Problematisch, da ich mit den Daten
Grafik animiere --> Das führt also zu ruckeln, stocken der Bewegung, etc. aber das ist ja erst mal egal:
Probleme sieht man schon nur bei der Ausgabe auf der Konsole.

Hab ich was falsch gemacht, oder sonst irgendwelche Ideen??????????

Danke schonn mal !

Gruß RobDom

PS: Muss bei UDP bleiben.


```
public class data extends JFrame implements Runnable{
	
	public static float[] data = new float[10];	
	public static TextArea console = new TextArea();
	
	public data() {
		
		for (int i=0; i<10; i++) {
			data[i]= 0;
			
		}
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		this.setMinimumSize(this.getToolkit().getScreenSize());
		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
		this.setLayout(new BorderLayout());
		this.add("Center",console);
		
		
		this.repaint();
		this.setVisible(true);
		this.run();
	}
	
	public void run(){
				
		while (true){
			new receive();
			for (int i=0; i<10; i++) {
				
				console.append(data[i] + "   ");
				
			}
			
			console.append("\n____________________________________\n");
		}
		
	}
	
	public static void main(String[] args) {
		
		new data();		
		
	} // end main
}
```


```
public class receive{
	
	public static int port = 2500;
	public static InetAddress ip = null;
	public static DatagramPacket datagramPacket = null;
	public static DatagramSocket datagramSocket = null;
	public static byte[] inbuffer = new byte[120];
	public ByteBuffer byteBuffer = ByteBuffer.allocate(120);	
	public static boolean init = false;
	
	public receive(){
		
		init();
		writeData(byteBuffer);

	}
	
	public void init(){
		
		datagramPacket = new DatagramPacket(inbuffer, inbuffer.length, ip, port);
		
		try {	 
			ip = InetAddress.getByName("10.3.71.44");
			datagramSocket = new DatagramSocket(port, ip);		
		} 
		
		catch (UnknownHostException e1) {}
		catch (SocketException e2) {}
		
		init = true;
	}
	
	public static void writeData(ByteBuffer buffer){
		
		try{
			datagramSocket.receive(datagramPacket);
			buffer = ByteBuffer.wrap(inbuffer, 0, 120);
			
			for (int i=0; i<10; i++) {
				data.data[i] =  buffer.getFloat(80+i*4);
			}
		}
			
		catch (UnknownHostException e3) {}
		catch (SocketException e4) {}
		catch (IOException e5) {}
			
		
	}


	public static void main(String[] args) {
		
		new receive();		
		
	} // end main
	
	
}
```


----------



## RobDom (5. Mrz 2008)

...kann es vielleicht daran liegen, dass ich das ganze aus Eclipse raus starte ???


----------



## tuxedo (6. Mrz 2008)

Kann es vielleicht sein dass du in einer Schleife (run()) immer und immer wieder mit "new" ein Objekt erzeugst das irgendwann mal vom GV aufgeräumt werden muss?

Sieht nicht effizient aus. Starte, nachdem du das Programm gestartet hast mal "jconsole" aus deiner JDK-Installtion und schaue wie sich der Speicher verhält und was der GC so treibt. 

- Alex


----------



## RobDom (6. Mrz 2008)

... das war nur ein Test, um das ganze auf mehrere Klassen, Threads aufzuteilen.

Wenn ich alles in eine Klasse packe und in der run() while(true) nur receive und speichere
in einen Array, hab ich genau das gleiche.

Mein eigentliches Programm steuert eine java3D Grafik, und die ruckelt dann...

Ideen??

Danke und Gruß


----------



## RobDom (19. Mrz 2008)

...ich hab Euch mal eine abgespeckte Version meines Programms
gebastelt, in dem man den Fehler sehr schön sehen kann.

ABER: immernoch das gleiche Problem:

Ist jetzt ein ColorCube, der sich um eine Achse dreht.
--> Mach ich das mit Scrollbar alles o.k.
--> Mit Daten über UDP ist es erst genauso schnell,
dann nach einer Zeit wirds sehr langsam und wieder schneller, usw.

Hab Eclipse, NetBeans, Konsole und .JAR ausprobiert und der Fehler bleibt
Ich denke immer noch es könnte an Speicher, Stack, Puffer, GarbageCollector, o.ä. liegen ????

Ich hoffe es hat einer eine Idee, ich verzweifel bald........

Danke und Gruß RobDom

PS: Zum testen muss die IP angepasst werden und Daten über UDP (Byte 80) kommen,
bei mir sind es einfach floats von 0 bis 360 und wieder von vorne.




```
package testudp;

import com.sun.j3d.utils.geometry.ColorCube;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Panel;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.vecmath.AxisAngle4f;

import com.sun.j3d.utils.universe.SimpleUniverse;


public class Main extends JFrame implements Runnable{
	
	public  int port = 2500;
	public  InetAddress IP = null;
	public  DatagramPacket datagramPacket = null;
	public  DatagramSocket Socket = null;
	public  byte[] inbuffer = new byte[120];
	public  ByteBuffer byteBuffer = ByteBuffer.allocate(120);	
			
	public  Scrollbar scrollTheta = new Scrollbar(Scrollbar.HORIZONTAL, 0, 0, 0, 10);
        public  JButton stop = new JButton("STOP / START");
	public  boolean stopped = true;
        
	public  GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
	public  Canvas3D canvas  = new Canvas3D(config);
	public  SimpleUniverse u = null;
	
        public  BranchGroup root = new BranchGroup();
        public  TransformGroup trans = new TransformGroup();
	public  Transform3D tra3d = new Transform3D();
        public  AxisAngle4f axis4f = new AxisAngle4f();
        public  float angle = 0.0f;
	
	
	public Main() {
		
		datagramPacket = new DatagramPacket(inbuffer, inbuffer.length, IP, port);
		try {	 
                        IP = InetAddress.getByName("10.3.71.44");
			Socket = new DatagramSocket(port, IP);	
			byteBuffer = ByteBuffer.wrap(inbuffer, 0, 120);
		} 
		catch (UnknownHostException e) {}
		catch (SocketException e) {}
				
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		this.setMinimumSize(this.getToolkit().getScreenSize());
		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
		
                this.setLayout(new BorderLayout());
		Panel panel = new Panel();
		panel.add("North",stop);
                panel.add("South",scrollTheta);
		scrollTheta.setPreferredSize(new Dimension(200, 50));
		scrollTheta.setMinimum(0);
		scrollTheta.setMaximum(360);
		scrollTheta.setBlockIncrement(1);
		scrollTheta.setEnabled(true);
                this.add("North",panel);
				
		u = new SimpleUniverse(canvas);
		u.getViewingPlatform().setNominalViewingTransform();
		this.add("Center",canvas);
				
		trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);	
		trans.addChild(new ColorCube(0.3));
		
                axis4f.angle = (float)(Math.PI/180*angle);
                axis4f.x =0.0f;
                axis4f.y =1.0f;
                axis4f.z =0.0f;
                tra3d.setScale(0.3);
	        tra3d.setRotation(axis4f);
		trans.setTransform(tra3d);
                root.addChild(trans);
		u.addBranchGraph(root);
		canvas.setVisible(true);
		
		stop.addActionListener(new ActionListener(){		
	
		public void actionPerformed (ActionEvent e){
				
					stopped = !stopped;
					
		}
		});
				
                this.repaint();
		this.setVisible(true);
		this.run();		
	}
	
	
	public void run() {
		
                while (true) {
                    
			if (!stopped){
                                try {	 
					Thread.sleep(30);
                                        
                                        try{
                                                Socket.receive(datagramPacket);
                                        }		
                                        catch (UnknownHostException e) {}
                                        catch (SocketException e) {}
                                        catch (IOException e) {}
                                       
                                        angle = byteBuffer.getFloat(80);					
                                        axis4f.angle = (float)(Math.PI/180*angle);
					tra3d.setRotation(axis4f);
					trans.setTransform(tra3d);						
				} 
				catch (InterruptedException e) {}
			}
			
			if (stopped){
				try {	 
					Thread.sleep(30);
					
                                        angle = (float)scrollTheta.getValue();
					axis4f.angle = (float)(Math.PI/180*angle);
                                       	tra3d.setRotation(axis4f);
					trans.setTransform(tra3d);						
				} 
				catch (InterruptedException e) {}
			}							
		}
	}

	
	public static void main(String[] args) {
		
		new Main();		
		
	}	
}
```


----------

