简单动画运行不流畅

时间:2018-07-31 16:22:35

标签: java animation processing

我有一个非常简单的Processing应用程序,可以在屏幕上移动矩形:

void setup() {
    size(800,600);
    thread("updateState");
    frameRate(100);
}

void draw() {
    background(#FFFFFF);
    rect(800f - position, 300f, 50f,30f);
}

float position = 0;
void updateState() {
  while(true) {
      position  = position < 850f ? position + 1f : 0f;
      delay(10);
  }
}

如果我每次将对象平滑移动1个像素,就可以理解这是因为更新线程或多或少与帧速率保持同步,因此口吃不多。但是,要将速度提高到4像素并不是很平滑:

position  = position < 850f ? position + 4f : 0f;

有办法克服吗?

1 个答案:

答案 0 :(得分:0)

我认为看不到您所说的口吃,但我会尽力提供一般帮助。

您为什么要使用线程来更新正在绘制的内容?

使用处理的draw()函数而不是自己进行更新循环,该函数每秒已被调用60次。

float position = 0;

void setup() {
  size(800, 600);
  frameRate(100);
}

void draw() {

  position  = position < 850f ? position + 4f : 0f;

  background(#FFFFFF);
  rect(800f - position, 300f, 50f, 30f);
}

如果出于某些原因绝对肯定要使用线程,则需要考虑concurrency。基本上,您需要考虑如果更新线程使用它在绘图线程中间更改position变量会发生什么。这些问题可能会导致结结和tearing。这就是为什么大多数UI库(包括处理)几乎都只使用一个线程进行更新和绘制的原因。

您可能还想研究delta timing,在其中计算自上次更新以来的时间,并根据该时间进行移动,而不是每帧移动固定距离。有关处理此操作的讨论,请参见this thread