我有一个非常简单的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;
有办法克服吗?
答案 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。