2010-11-05 4 views
2

Je me connecte à un serveur Web distant pour enregistrer les mouvements de la souris dans une base de données. Le programme de traitement que j'ai écrit pour animer ces mouvements a été INCROYABLEMENT agité depuis que j'ai mis le code sur le serveur. Je réalise que c'est parce que plutôt que de courir localement, il faut aller chercher l'information, mais est-il possible d'accélérer les choses un peu? Voici le code que je utiliseTraitement d'une animation extrêmement instable lors de l'obtention de données depuis un hôte distant

String get_users = "http://example.com/get_users.php"; 
String get_data = "http://example.com/get_data.php?user="; 
ArrayList arrows; 
PImage mouse; 
int[] user_ids; 
int num_users; 

void setup() { 
    size(1024, 768); 
    frameRate(24); 
    smooth(); 
    noStroke(); 
    mouse = loadImage("arrow-clear.png"); 
    arrows = new ArrayList(); 
    getUsers(); 

    for (int i = 0; i < num_users; i++){ 
    arrows.add(new Arrow(user_ids[i], i*400, 2*i*100)); 
    } 
} 

void getUsers(){ 
    user_ids = int(loadStrings(get_users)); 
    num_users = user_ids.length; 
    println(num_users); 
} 

void draw() { 
    background(0); 

    if (frameCount % 600 == 0){ 
    getUsers(); 
    for (int i = 0; i < num_users; i++){ 
     arrows.add(new Arrow(user_ids[i], i*400, 2*i*100)); 
    } 
    } 

    for (int i = arrows.size()-1; i >= 0; i--) { 
    Arrow arrow = (Arrow) arrows.get(i); 
    arrow.move(); 
    if (arrow.finished()) { 
     arrows.remove(i); 
    } 
    } 

} 

class Arrow { 
    String[] all_moves, move_pairs, new_moves; 
    int[] moves; 
    float x; 
    float y; 
    int id; 
    int i = 0; 
    Boolean is_done = false; 

    Arrow(int tempID, float tempX, float tempY) { 
    all_moves = loadStrings(get_data + tempID); 
    id = tempID; 
    x = tempX; 
    y = tempY; 
    if (all_moves.length > 0){ 
     move_pairs = shorten(split(all_moves[0], "|")); 
    } 
    } 

    void move() { 
    if (move_pairs != null){ 
     if (i < move_pairs.length){ 
     moves = int(split(move_pairs[i], ",")); 
     image(mouse, moves[0], moves[1]); 
     ++i; 
     } else { 
     all_moves = loadStrings(get_data + id); 
     if (all_moves.length > 0){ 
      new_moves = shorten(split(all_moves[0], "|")); 
      for (int j = 0; j < new_moves.length; j++){   
      move_pairs = append(move_pairs, new_moves[j]); 
      } 
      println(move_pairs); 
     } else { 
      is_done = true; 
     } 
     } 
    } else { 
     is_done = true; 
    } 
    } 

    boolean finished() { 
    if (is_done) { 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 

EDIT: Pour clarifier: l'application de traitement faisant toute l'animation est en cours d'exécution au niveau local. Les points X et Y de la souris sont les seuls éléments téléchargés depuis le serveur.

+0

utilisez Javascript ou Flash du côté client pour l'animation –

+0

peut-être configurer votre serveur pour envoyer en plus petits morceaux? – Dereleased

Répondre

1

Vous souhaitez transférer toutes les données de mouvement (ou de gros morceaux) vers le client et laisser le client effectuer le travail d'animation.

0

Je doute que ce soit une bonne idée de télécharger les données de mouvement sur chaque image. Si vous n'avez pas besoin d'une réponse aussi détaillée, récupérez périodiquement un lot de mouvements du serveur et mettez-les en file d'attente pour la méthode draw. Sinon, assurez-vous que le serveur envoie uniquement les données nécessaires. J'ai réalisé que vous n'utilisez que la première ligne des données récupérées sur le serveur - all_moves[0]. S'il n'y a en effet qu'une seule ligne, c'est bien. Vous devriez envisager d'utiliser createInput(URL) et lire à partir de ce flux, de cette façon vous n'aurez pas besoin d'ouvrir un nouveau flux d'entrée pour chaque mouvement demandé, mais votre code côté serveur doit pouvoir maintenir les flux et leur écrire en continu .

Questions connexes