Java:提高慢线程动画的流畅度?

时间:2013-02-06 13:59:08

标签: java multithreading animation graphics

我正在尝试制作一个动画,就像曲棍球碟慢慢移动,速度一点一点地降低。

所以我试着这样做:

for(Disc d : panel.getDiscs()
{
    if(d.getLaunch() <= 70) move(d);
}

并且:

private void move(Disc d)
{
        Point p = d.getLocation();
        Point speed = d.getSpeed();
        Dimension size = d.getSize();

        int vx = speed.x;
        int vy = speed.y;

        int x = p.x;
        int y = p.y;

        if (x + vx < 0 || x + size.width + vx > panel.getWidth()) {
            vx *= -1;
        }
        if (y + vy < 0 || y + size.height + vy > panel.getHeight()) {
            vy *= -1;
        }
        x += vx;
        y += vy;

        d.setSpeed(new Point(vx, vy));
        d.setLocation(new Point(x, y));

    try
    {
        Thread.sleep(d.getLaunch());
    } catch (InterruptedException e)
    {
        e.printStackTrace();
    }
        if(d.getCoeff() < 5) d.setCoeff(d.getCoeff()+1);
        else { d.setLaunch(d.getLaunch()+1); d.setCoeff(0); }
}

我在这里要做的是增加一个从20开始并一直运行到70的值(启动),然后我在每个Thread.sleep(launch);中使用这个值。 我只在先前显示5帧(coeff)时增加此值。

问题如下:当我尝试使用太小的值时,光盘太快并且太早停止运行。当我尝试使用更高的值时,光盘速度看起来不错,但最后的动画不是很平滑......我该怎么办?

4 个答案:

答案 0 :(得分:3)

你最应该做的是什么,以及哪些会改善动画的流畅度,不是使用sleep作为动画节奏的方法。这阻挡了负责绘制冰球的线程。你需要的是一个SwingTimer,它被适当地安排来执行动画。给它一个稳定的射击速度,并通过你应用的位置增量来控制速度。

答案 1 :(得分:1)

我建议不要使用Thread.sleep,而是实现一个游戏循环,它经常被定时器调用,然后只是慢慢降低每个循环的速度。

答案 2 :(得分:1)

您的方法似乎无效。显示光盘并确定它的位置是两回事。我认为:

  • 在一个帖子中你应该定期(每秒100次?)计算光盘的位置
  • 每秒几次你应该降低光盘的速度(基于System.currentTimeMIlliseconds()的速度降低,而不是循环执行的次数)
  • 每秒30-60次绘制光盘的位置

答案 3 :(得分:1)

您应该使用时间增量来计算每次迭代中移动的距离(记住:dx = v*dt),这样您的动画速度就会与更新速率无关。

然后你可以使用已经提到的任何其他技巧(比如一个计时器)来使它更稳定。