Как я могу оптимизировать анимацию в обработке и не допустить, чтобы она оставила след изображений? - PullRequest
1 голос
/ 29 мая 2019

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

Я очень плохо знаком с обработкой, и я действительно не уверен, как решить эту проблему. Может быть, удалить предыдущие изображения после задержки, чтобы создать сокращенный след?

Это только те части, которые, я думаю, важны для вишни, взятые из кода, это всего лишь пример одной планеты. Извините, если код неуклюжий, любые предложения с радостью принимаются.

Planet p1;

void setup() {
 mercury = loadImage("mercury.png")

 p1 = new Planet(40, random(TWO_PI), 0.05);

}

void draw() {
  //background(0)
  translate(width / 2, height / 2);
  p1.display1();
  p1.orbit();
}


class Planet  {
  float radius;
  float angle;
  float distance;
  float orbitSpeed;

  Planet(float r, float d, float o) {
     radius = r;
     distance = d;
     orbitSpeed = o;
     angle = random(TWO_PI);
  }

  void orbit() {
    angle = angle + orbitSpeed;
  }

  void display1() {
    pushMatrix();
    rotate(angle);
    translate(distance, 0);
    imageMode(CENTER);
    image(mercury, radius, radius, 10, 10);
    popMatrix();
  }
}

Я понял, что это, вероятно, произойдет, и я не уверен, как это остановить.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Ваш код достаточно прост, чтобы не нуждаться в оптимизации на данном этапе.Как упоминает велосипед, вы рисуете изображение в переведенной позиции, очень похожее на blitting .

С точки зрения следов, вы можете использовать одну распространенную уловку - не полностью очистить экран, но нарисуйте прозрачный прямоугольник в качестве фона.Чем больше прозрачности, тем дольше трейлы.

Вот измененная версия вашего кода:

// planet object
Planet p1;
// planet texture
PImage mercury;

void setup() {
  size(300, 300);
  // draw image from center
  imageMode(CENTER);
  // clear to black one
  background(0);
  // remove strokes (we'll use rect() later)
  noStroke();
  // set the fill to black but with 9/255 transparency (~3.5% transparent)
  fill(0,9);
  // init texture
  mercury = loadImage("mercury.png");
  // init planet
  p1 = new Planet(40, random(TWO_PI), 0.05);
}

void draw() {
  // draw a transparent rectangle instead of completely clearing the screen
  rect(0,0,width,height);
  // render planet
  translate(width / 2, height / 2);
  p1.display1();
  p1.orbit();
}


class Planet {
  float radius;
  float angle;
  float distance;
  float orbitSpeed;

  Planet(float r, float d, float o) {
    radius = r;
    distance = d;
    orbitSpeed = o;
    angle = random(TWO_PI);
  }

  void orbit() {
    angle = angle + orbitSpeed;
  }

  void display1() {
    pushMatrix();
    rotate(angle);
    translate(distance, 0);
    image(mercury, radius, radius, 10, 10);
    popMatrix();
  }
}

Это эффективный быстрый и полезный хак, так как вам не нужно сохранять предыдущиеПоложение и перерисовывать несколько раз, однако это имеет свои ограничения с точки зрения гибкости трасс.Надеемся, что настройка альфа-параметра fill() даст вам желаемый эффект.

Позже, если вы рисуете много-много планет, все начинает работать медленнее, пик достигает VisualVM .Профилируйте ЦП и посмотрите методы, которые требуются больше всего времени для завершения и сосредоточиться на них.Не нужно оптимизировать все, только самые медленные звонки.Помните, что у Processing есть несколько средств визуализации: JAVA2D - это значение по умолчанию, но есть также FX2D и P2D / P3D, и они будут вести себя по-разному.Я настоятельно рекомендую оптимизировать в последний момент (в противном случае код может быть менее гибким и читабельным, что замедлит разработку / итерацию).

0 голосов
/ 30 мая 2019

Поведение, которое вы описываете, является просто природой компьютерной графики;это то, как игры, операционные системы и аппаратные средства отображения работают все - они очищают и перерисовывают все в каждом кадре.

В Обработка графические объекты, которые помещаются в буфер, остаются там неопределенно долго, пока буфер не будет очищен или что-то не будет помещено поверх них (именно поэтому планеты покидают след безвызов background() - предыдущие кадры остаются в буфере).

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

Обработка обеспечивает clear() функцию, но это эквивалентно background(0).

Если вы все еще беспокоитесь об эффективности и скорости, один из способов ускорить Обработка должна использовать рендерер FX2D вместо рендерера AWT по умолчанию.Другой способ - кэшировать нарисованные объекты в PGraphics объекты, чтобы предотвратить последовательную растеризацию (поскольку ваши планеты являются файлами изображений и не прорисованы при обработке, вам не нужно об этом беспокоиться).

...