2017-07-23 2 views
0

Ich arbeite an einer Skizze, die Netzwerkereignisse von einem externen Programm (speziell eine OpenFrameworks-Skizze) erhält, mit der processing.net-Bibliothek.Verarbeitung: Label Text langsam über Netzwerkereignisse zu aktualisieren

Innerhalb der Zeichenmethode, ich habe den folgenden Code zu analysieren, um die eingehenden Daten und ordnen sie in geeigneter Weise einen Wert von Text in einer Textbeschriftung angezeigt werden: die

void draw() 
{ 
    // check for incoming data 
    Client client = server.available(); 
    if (client != null) { 
    // check for a full line of incoming data 
    String line = client.readStringUntil('\n'); 

    if (line != null) { 
     //println(line); 
     int val = int(trim(line)); // extract the predicted class 
     //println(val); 
     if (val == 1) { 
     messageText = "EVENT 1"; 
     } else if (val == 2) { 
     messageText = "EVENT 2"; 
     } else if (val == 3) { 
     messageText = "EVENT 3"; 
     } 
    } 
    } 

    // draw 
    background(0); 
    textFont(f,64); 
    fill(255); 
    textAlign(CENTER); 
    text(messageText, width/2, height/2); 

} 

Durch Protokollierung, habe ich das überprüft Daten werden richtig empfangen

Ich habe jedoch einen sehr nervigen Bug - der Text meines messageText Labels ist sehr langsam zu aktualisieren ... nachdem ein neues Ereignis aufgetreten ist (und als solches durch Protokollierung angezeigt wird), Der Nachrichtentext zeigt weiterhin den Wert des letzten Ereignisses für einige Sekunden an.

Wer hat irgendwelche Hinweise, wie man die Leistung hier beschleunigt?

Danke!

EDIT: Unten ist die vollständige, komplette Skizze Code:

import processing.net.*; // include the networking library 

Server server; // will receive predictions 
String messageText; 
PFont f; 

void setup() 
{ 
    fullScreen(); 
    //size(200,200); 

    server = new Server(this, 5204); // listen on port 5204 
    messageText = "NO HAND"; 

    f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on 
} 

void draw() 
{ 
    // check for incoming data 
    Client client = server.available(); 
    if (client != null) { 
    // check for a full line of incoming data 
    String line = client.readStringUntil('\n'); 

    if (line != null) { 
     //println(line); 
     int val = int(trim(line)); // extract the predicted class 
     //println(val); 
     if (val == 1) { 
     messageText = "EVENT 1"; 
     } else if (val == 2) { 
     messageText = "EVENT 2"; 
     } else if (val == 3) { 
     messageText = "EVENT 3"; 
     } 
    } 
    } 

    // draw 
    background(0); 
    textFont(f,64); 
    fill(255); 
    textAlign(CENTER); 
    text(messageText, width/2, height/2); 

} 

EDIT2 Als Kevin unten wies darauf hin, meine Lösung ist ziemlich hacky. Ich versuche, die Message Events Methoden aus der Netzwerkbibliothek zu verwenden, anstatt meinen gesamten Netzwerkcode innerhalb der draw()-Methode stopfen.

Also habe ich versucht, die Methode clientEvent als solche zu implementieren. Allerdings glaube ich, dass ich etwas falsch verstanden habe ... obwohl mein ursprünglicher, Hacky-Code jetzt OK zu funktionieren scheint, scheint mein neuer Code unter Verwendung dieser Delegiertenmethode überhaupt nicht zu funktionieren. Grundsätzlich muss ich zuerst meine Skizze ausführen, wodurch ein Server entsteht, mit dem mein externes Programm verbunden ist. Das Programm sendet dann Daten, die von meiner Verarbeitungsskizze empfangen wurden.

So sieht meine vollständige Skizze aus - weiß jemand wo mein Missverständnis herkommt?

import processing.net.*; // include the networking library 

Server server; // will receive predictions 
Client client; 
String messageText; 
int dataIn; 
PFont f; 

void setup() { 
    fullScreen(P3D); 
    frameRate(600); 
    server = new Server(this, 5204); // listen on port 5204 
    client = server.available(); 

    messageText = "NO HAND"; 
    textAlign(CENTER); 
    fill(255); 
    f = createFont("Arial",48,true); // Arial, 16 point, anti-aliasing on 
    textFont(f, 120); 
} 

void draw() { 
    // draw 
    background(0); 
    text(messageText, width/2, height/2); 
} 

// If there is information available to read 
// this event will be triggered 
void clientEvent(Client client) { 
    String msg = client.readStringUntil('\n'); 
    // The value of msg will be null until the 
    // end of the String is reached 
    if (msg != null) {  
     int val = int(trim(line)); // extract the predicted class 
     println(val); 
     if (val == 1) { 
     messageText = "A"; 
     } else if (val == 2) { 
     messageText = "B"; 
     } else if (val == 3) { 
     messageText = "C"; 
     } else if (val == 4) { 
     messageText = "D"; 
     } 
    } 
    } 

} 
+0

Es wird ziemlich schwierig sein, Ihnen zu helfen, ohne ein [mcve] zu sehen. Wo sprichst du mit diesem Protokoll? –

+0

@KevinWorkman Es sind die 'println (val)' - Funktionen, die momentan auskommentiert sind. Ich habe den Beitrag mit der vollständigen Skizze aktualisiert. Vielen Dank! – narner

+0

Ich sehe nichts falsch daran, außer vielleicht die 'client' Variable innerhalb der' draw() 'Funktion zu erstellen. Sollten Sie das nicht einfach einmal in der 'setup()' Funktion erstellen? –

Antwort

0

So endete die Antwort mit der Framerate und dem Renderer, die im Projekt verwendet wurden. Da der Netzwerkaktualisierungscode in der Methode draw meiner Skizze aufgerufen wurde, war die Geschwindigkeit, mit der er aufgerufen wurde, abhängig von der verwendeten Framerate/Renderer.

Nach ein wenig Experimentieren/Versuch-und-Fehler, die Skizze zu ändern, um den FX2D-Renderer zu verwenden, und eine Framerate von 600, erheblich verbesserte Leistung in dem Grad, in dem ich brauchte.

void setup() 
{ 
    fullScreen(FX2D); 
    frameRate(600); 
    ... 
} 

EDIT: Nach einem Gespräch mit einem der Verarbeitungs Mitglieder des Kernteams, ich überlege, mein Netzwerk-Code korrekt und vollständig sind. Durch den Wechsel des Renderers zu FX2D wurde die Leistung deutlich verbessert.

In meinem sehr speziellen Anwendungsfall, ich die Skizze Vollbild auf einem MacBookPro mit Retina-Display laufen. Wenn ich den Framerate-Wert hochhielt und den Renderer änderte, erhielt ich die Leistung, die ich für meine schnellen Prototypskizzen benötigte.

+0

Dieser Ansatz wird eine Tonne CPU-Auslastung verschlingen - und auf Dinge warten, die normalerweise viel seltener passieren. Sie würden wahrscheinlich besser auf einen ereignisbasierten Ansatz umsteigen, statt ständig zu pollen. –

+0

Nicht ganz sicher, wie man eine Event-basierte Annäherung an @KevinWorkman durchführt - was würden Sie vorschlagen? – narner

+1

Überprüfen Sie den Abschnitt ** Netzwerkereignisse ** der Referenz für die Netzwerkbibliothek [hier] (https://processing.org/reference/libraries/net/index.html). –