Прежде всего, этот бит здесь является проблемой:
// destroy unneeded processes
Toolkit.getDefaultToolkit().sync();
g.dispose();
В общем, удаление ресурса, который вы не создали, вероятно, плохая идея. В этом конкретном случае Graphics
, переданный в paint()
, вероятно, используется всеми другими компонентами в иерархии, поэтому это может привести к действительно странным результатам.
Звонок Toolkit.sync()
вот, я думаю, ваша попытка устранить разрыв, который вы видели при перемещении вещей в фоновом режиме. Но все, что он делает, это сбрасывает любые ожидающие инструкции по рисованию. Это не имеет никакого эффекта, потому что вы, вероятно, рисуете в компонент Swing с обратной буферизацией, который будет отрисован полностью позже.
Правильный способ устранить разрыв - это выполнять любые обновления в потоке событий, чтобы вы не изменяли данные экрана во время их рисования. Одним из простых способов реализовать это было бы, чтобы ваш таймер просто вызывал repaint()
и имел метод paint()
вызывать цикл (), прежде чем что-либо делать.
Для борьбы с задержкой одним из решений может быть разрешение переменной частоты кадров. Вместо того, чтобы перемещать все на фиксированное расстояние в каждом кадре, рассчитайте время с последнего кадра и переместите все соответствующим образом.