Обработка анимации крайне прерывистая при получении данных с удаленного хоста - PullRequest
2 голосов
/ 05 ноября 2010

Я подключаюсь к удаленному веб-серверу, чтобы сохранить движения мыши в базе данных. Программа обработки, которую я написал для анимации этих движений, НЕВЕРОЯТНО изменялась с момента размещения кода на сервере. Я понимаю, что это потому, что вместо того, чтобы работать локально, нужно получать информацию, но возможно ли немного ускорить процесс? Вот код, который я использую

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;
    }
  }
}

РЕДАКТИРОВАТЬ: Чтобы уточнить: приложение обработки, выполняющее всю анимацию, работает локально. Точки X и Y для мыши - единственное, что загружается с сервера.

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Вы хотите передать все данные о движении (или их большие куски) клиенту и позволить клиенту выполнять всю анимацию.

0 голосов
/ 12 января 2011

Я сомневаюсь, что это хорошая идея - загружать данные о движении для каждого отдельного кадра.Если вам не нужна такая подробная реакция, периодически извлекайте пакет движений с сервера и ставьте их в очередь для метода отрисовки.В противном случае убедитесь, что сервер отправляет только необходимые данные.Я понял, что вы используете только первую строку данных, полученных с сервера - all_moves[0].Если на самом деле есть только одна строка - отлично.

Вы должны рассмотреть возможность использования createInput(URL) и чтения из этого потока, таким образом, вам не нужно открывать новый входной поток для каждого запрошенного движения, новаш код на стороне сервера должен поддерживать потоки и записывать их непрерывно.

...