Java-апплет обновляется только со скоростью 10 кадров в секунду

#java #animation #applet #drawing #appletviewer

#java #Анимация #апплет #рисование #appletviewer

Вопрос:

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

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

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

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

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

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

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

Комментарии:

1. Кстати, в чем именно ваш вопрос?

2. Теперь проблема решена…

Ответ №1:

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

Комментарии:

1. Я видел использование repaint() at profs.etsmtl.ca/mmcguffin/learn/java И я не думаю, что мы занимаемся каким-то свингом после того, как учитель сказал что-то вроде: «Я знаю достаточно всего, что касается программ, чтобы научить этому, так что, если вы, ребята, хотите заняться чем-то более продвинутым, не спрашивайте меня, посмотрите »

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

Ответ №2:

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