Таймеры Java Swing идут с разными скоростями - PullRequest
3 голосов
/ 03 декабря 2011

Я делаю 2D-платформу на Java и использую таймер Swing, он установлен с интервалом в 5 миллисекунд. Тем не менее, иногда это плавное движение с хорошей скоростью, но в случайном порядке оно становится очень быстрым, а иногда и супер медленным. В чем может быть причина этого?

Код:

public Board() {
    addKeyListener(new KeyListener());
    setFocusable(true);
    setBackground(new Color(204,250,255));

    //draws the object off the screen in memory, then brings it in
    setDoubleBuffered(true);

    ...(other code not relevant)...

    timer = new Timer(5, this);
    timer.start();
}

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;

    //draw platform
    for(int i = 0; i < platform.length; i++) {
        //g2d.setColor(new Color(0,0,0));
        //g2d.drawRect(platform[i].getX(), platform[i].getY(), platform[i].getWidth(), platform[i].getHeight());
        g2d.drawImage(platform[i].getImage(), platform[i].getX(), platform[i].getY(), this);
    }

    //draw guy
    g2d.drawImage(guy.getImage(), guy.getX(), guy.getY(), this);

    //destroy unneeded process
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

По сути, функция цикла решает, должен ли персонаж двигаться или нет, и перемещает его, если это так.

1 Ответ

0 голосов
/ 23 декабря 2011

Трудно заставить Java работать как системы реального времени….из-за неизвестных факторов, таких как, когда ОС запланирует запуск вашего процесса и сборщик мусора.Поскольку вы пытаетесь обновить игру со скоростью 200 кадров в секунду (если моя математика верна), вы можете попробовать следующий подход.Чтобы сделать игру более плавной, я бы попытался найти время между текущим и последним событиями, которое теперь теоретически может составлять 5 мс, но иногда это будет 7 мс (идет очень медленно), а иногда - 3 мс (идет очень быстро).).Если у вас есть время между двумя событиями, я бы вычислил, где должна быть анимация, поэтому, если время равно 3 мс, анимация будет немного раньше времени 5 мс.Давайте рассмотрим простой пример, когда вы пытаетесь обновить позицию X изображения 5 пикселей каждые 5 мс.

//your current code
newX = X + 5px

//new code
//this wont always be 5ms
timeDiff = currentEventTime – lastEventTime;

newX = X + 5px (timeDiff/5ms)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...