Апплет Java обновляется только со скоростью 10 кадров в секунду - PullRequest
1 голос
/ 01 ноября 2011

Одно из моих недавних заданий на Java (курс средней школы ...) - создать апплет, в котором нарисована граница, и шар движется по экрану, подпрыгивая на границах.У меня установлен Fraps, и он сообщает, что апплет работает только со скоростью 10 кадров в секунду, что делает анимацию очень посредственной.

Мой оригинальный способ рисования анимации:

  1. вызовите мой метод: drawScreen() in paint()
  2. с Thread.sleep(1000/frameRate) паузой в drawScreen() для частоты кадров, которая передается из html
  3. call repaint()

Это сработало чудесно, и апплет работал как сон ... Пока я не увидел оценочный лист, где говорилось, что я не должен перерисовывать экран каждый раз (может быть,это потому, что компьютеры работают необычно медленно, и мои друзья жалуются, что их апплеты мерцают достаточно, чтобы вызвать дискомфорт в глазах и много слез повсюду), и я должен нарисовать шар, а затем нарисовать другой шар тот же цвет фона , чтобы скрыть его, вычислить координаты и повторять до тех пор, пока апплет не закроется

Проблема в том, что

  • repaint() не можетназываться
  • моя анимация ограничена 10 кадрами в секунду
  • нет доступных потоков, чтобы ответить мне, щелкнув закрыть на appletviewer или что-то еще в апплете / средстве просмотра.

Есть лиспособ для моей анимации работать со скоростью более 10 кадров в секунду без использования repaint()?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011
  1. Не:
    1. Выполнять пользовательскую анимацию в контейнере верхнего уровня, например Applet (/ JAppet) или Frame (/ JFrame).Вместо этого поместите пользовательский чертеж в Canvas / Panel или JComponent / JPanel, затем поместите этот компонент в контейнер верхнего уровня.
    2. Используйте компоненты AWT в этом тысячелетии.
    3. Переопределить paint() для компонентов Swing - оно должно быть paintComponent(Graphics).
  2. Не использовать Thread.sleep(n) на краске.Вместо этого используйте Swing Timer и выполните действие ..
  3. Call repaint().
0 голосов
/ 05 ноября 2011

Оказывается, мне нужно было либо реализовать двойную буферизацию, либо запустить апплет в браузере с двойной буферизацией.AppletViewer ограничил анимацию до 10 кадров в секунду, потому что он автоматически не буферизовал апплеты, и я все это время запускал апплет внутри него.

...