Hallo zusammen,
habe ein Performance Problem bei Daten über eine UDP.
Ich bekomme aus einer Steuerung alle 20ms ein 1200 Byte Packet,
jetzt lese ich die Daten über DatagramSocket ein und speichere sie
anschließend in Arrays, um dann damit java3D Transformationen zu setzen.
Leider ist die Grafikdarstellung etwas ruckelig und ich habe festgestellt, dass
das nur so ist, wenn das Datenlesen läuft. Dann habe ich mir mal ein paar
Zeitstempel gemacht und festgestellt, dass das laden der Daten DatagrammSocket.receive
zwischen 40ms und mehreren hundert ms dauert, und auch teilweise Packete vertauscht werden.
Hier ein Code-Ausschnitt:
Ich habe schon probiert die Grafikvearbeitung, das Schreiben der Daten in die Arrays, usw.
auszukommentieren und es ist immer noch genauso langsam. Die Rechenzeitprobleme kommen
aus Zeile 76 !!
Mein Problem:
- Performance, ich schaffe es nicht alle 20ms die 1200Byte zu empfangen und zu verarbeiten.
- Zuverlässigkeit, es werden Packete "verschluckt" oder vertauscht.
Hab ich irgendwas falsch gemacht oder vergessen?? Oder hat jemand eine andere schnellere Idee??
Danke und Gruß
habe ein Performance Problem bei Daten über eine UDP.
Ich bekomme aus einer Steuerung alle 20ms ein 1200 Byte Packet,
jetzt lese ich die Daten über DatagramSocket ein und speichere sie
anschließend in Arrays, um dann damit java3D Transformationen zu setzen.
Leider ist die Grafikdarstellung etwas ruckelig und ich habe festgestellt, dass
das nur so ist, wenn das Datenlesen läuft. Dann habe ich mir mal ein paar
Zeitstempel gemacht und festgestellt, dass das laden der Daten DatagrammSocket.receive
zwischen 40ms und mehreren hundert ms dauert, und auch teilweise Packete vertauscht werden.
Hier ein Code-Ausschnitt:
Code:
public class connection implements Runnable{
private static DatagramPacket datagramPacket = null;
private static DatagramSocket datagramSocket = null;
private static byte[] inbuffer = new byte[1200];
private static ByteBuffer byteBuffer = ByteBuffer.allocate(1200);
public static boolean loaded = false;
public static void setIP() {
if (useStandard) {
try {
IP = InetAddress.getLocalHost().getHostAddress();
}
catch (UnknownHostException e) {
}
}
} // end setIP
public static void initConnection() {
datagramPacket = new DatagramPacket(inbuffer, inbuffer.length);
// Initialize SocketConnection
try {
setIP();
InetAddress address = InetAddress.getByName(IP);
datagramSocket = new DatagramSocket(port, address);
}
catch (UnknownHostException e) {
openMainFrame.console.append("\nERROR: UnknowHostException\n" + e.toString() + "\n");
}
catch (SocketException e) {
openMainFrame.console.append("\nERROR: SocketException\n" + e.toString() + "\n");
}
// Timeout Recieve Data
try {
datagramSocket.setSoTimeout(1000);
}
catch (SocketException e) {
openMainFrame.console.append("\nERROR: SocketException\n" + e.toString() + "\n");
}
try {
openMainFrame.console.append("\nTimeout: " +datagramSocket.getSoTimeout());
}
catch (SocketException e) {
openMainFrame.console.append("\nERROR: SocketException\n" + e.toString() + "\n");
}
} // end initConnection
public void run (){
while (true){
if (Thread.interrupted()) {
break;
}
try{
Thread.sleep(transmissionRate);
}
catch (Exception e){}
// Receive Data
try {
datagramSocket.receive(datagramPacket);
}
catch (IOException e) {
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
openMainFrame.console.append("\nERROR: InterruptedException\n" + ex.toString() + "\n");
}
openMainFrame.console.append("\n... receive tried to execute");
}
// Read Data
String[] fileName = {"", "", "", "", "", "", "", "", "", ""};
char[][] readName = new char[10][32];
float[][] position = new float[10][6];
float[][] tcp = new float[10][6];
float[][] axisData = new float[10][10];
int end[] = new int[10];
byteBuffer = ByteBuffer.wrap(inbuffer, 0, 1200);
for (int i=0; i<10; i++) {
// Filename
for (int j=0; j<32; j++) {
readName[i][j] = (char)byteBuffer.get(j+i*120);
if ((char)byteBuffer.get(j+i*120) == ''){
end[i] = j;
break;
}
}
for (int k=0; k<end[i] ;k++) {
fileName[i] = fileName[i] + String.valueOf(readName[i][k]);
}
// Machine Position
for (int j=0; j<6; j++) {
position[i][j] = byteBuffer.getFloat(32+j*4+i*120);
}
// TCP Position
for (int j=0; j<6; j++) {
tcp[i][j] = byteBuffer.getFloat(56+j*4+i*120);
}
// Axis Data
for (int j=0; j<10; j++) {
axisData[i][j] = byteBuffer.getFloat(80+j*4+i*120);
}
// usw. ab hier Grafiksteurung...
} // end run
Ich habe schon probiert die Grafikvearbeitung, das Schreiben der Daten in die Arrays, usw.
auszukommentieren und es ist immer noch genauso langsam. Die Rechenzeitprobleme kommen
aus Zeile 76 !!
Mein Problem:
- Performance, ich schaffe es nicht alle 20ms die 1200Byte zu empfangen und zu verarbeiten.
- Zuverlässigkeit, es werden Packete "verschluckt" oder vertauscht.
Hab ich irgendwas falsch gemacht oder vergessen?? Oder hat jemand eine andere schnellere Idee??
Danke und Gruß