我正在用Java编写模拟,其中对象在牛顿物理学下运作.物体可以施加力,并且所产生的速度使其在屏幕上移动.模拟的本质意味着对象根据动画循环的当前和上一次迭代之间的时间间隔以不连续的步骤移动; 例如
public void animationLoop() {
long prev = System.currentTimeMillis();
long now;
while(true) {
long now = System.currentTimeMillis();
long deltaMillis = now - prev;
prev = now;
if (deltaMillis > 0) { // Some time has passed
for (Mass m : masses) {
m.updatePosition(deltaMillis);
}
// Do all repaints.
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果动画线程以某种方式延迟导致大量时间坍塌(经典案例在Windows下,单击并保持最小化/最大化防止重新绘制),则会出现问题,这会导致对象以惊人的速度移动.我的问题:有没有办法确定动画线程花费的时间而不是挂钟时间,或者有人可以建议一个解决方法来避免这个问题吗?
到目前为止,我唯一的想法是deltaMillis通过一些上限来构建.
您是否考虑过使用定时器而不是循环旋转?
TimerTask tt = new TimerTask(){
long prev = System.currentTimeMillis();
public void run(){
long now = System.currentTimeMillis();
for (Mass m : masses) {
m.updatePosition(now-prev);
}
prev = now;
}
}
new Timer(true).schedule(tt, 1000, 1000) ;
Run Code Online (Sandbox Code Playgroud)
这样你就可以保证在对象更新之间至少有一些延迟,所以你不应该像while(true)循环那样连续重复一遍,如果线程被延迟你就不会立即重新获得 - 从文档执行任务:"在固定延迟执行中,每次执行都是相对于上一次执行的实际执行时间进行调度的."
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |