Можно ли использовать поток для каждой анимации в Java-программе? - PullRequest
4 голосов
/ 01 сентября 2010

Я работаю над Java-программой, которая содержит много анимаций как часть пользовательского интерфейса. Каждая анимация требует вызова метода перерисовки для того, чтобы анимация произошла. Мне просто интересно, было ли хорошо программировать использование отдельного потока для каждой анимации, каждый из которых вызывал бы свои соответствующие методы перерисовки.

Ответы [ 5 ]

2 голосов
/ 01 сентября 2010

Нет. Или да, в зависимости от того, что вы делаете.

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

Если у вас МНОГО потоков, будет снижение производительности. Я не знаю, каким будет это наказание для вашего приложения - вам придется экспериментировать, если вы действительно хотите знать.

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

1 голос
/ 01 сентября 2010

Я предполагаю, что вы используете Swing?Я не уверен, однако.

Я бы предложил прочитать http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html и найти дополнительную информацию о потоках в Swing.В общем случае единственным потоком, который должен обновлять графический интерфейс, должен быть поток диспетчеризации событий, хотя есть несколько исключений.

Я думаю, что использование потоков - это нормально, просто попросите поток диспетчеризации событий обновить ваш интерфейс,

т.е.

    java.awt.EventQueue.invokeLater(new Runnable()
    {

        public void run()
        {
            //this codes runs on the event dispatch thread
        }
    });
1 голос
/ 01 сентября 2010

Нет, потому что издержки всех этих потоков сделают процесс неэффективным.

0 голосов
/ 01 сентября 2010

Я знаю, что видел некоторые фреймворки, которые делают именно это, посмотрите JGoodies библиотека анимаций;Я думаю , вот где я это увидел.

Обычно идея состоит в том, чтобы минимизировать количество потоков (при условии, что обновления анимации выполняются быстро, как переключение на уже загруженную картинку), вы можете создатьИнтерфейс клиента анимации, который один поток анимации вызывает метод обновления в EDT для всех клиентов, нуждающихся в этом:AnimatedComponent (s), вызывая updateAnimation при необходимости.

public void updateAllAnimations() {
 long nowTime = System.currentTimeMillis();
 for (AnimatedComponent c : someList) {
  if (c.getLastUpdateTime() - nowTime >= c.getInterval()) {
   c.updateAnimation();
   c.repaint();
  }
 }
}

Вы должны запланировать это на колебательном EDT из потока таймера периодически (2-3 раза в секунду, в зависимости от того, насколько быстро ожидается обновление вашей анимации).

0 голосов
/ 01 сентября 2010

Для swing было бы лучше использовать один (или более) javax.swing.Timer (s). Пусть вызов таймера перерисовывается на всех ваших компонентах, нуждающихся в обновлении (анимация). Вы можете сделать один пользовательский таймер, который позволит вам добавлять / удалять компоненты. Но будьте осторожны со всеми вовлеченными темами. (Вам не нужны проблемы взаимоблокировки / синхронизации.) Все таймеры используют один и тот же поток для ожидания и запускают код в потоке диспетчеризации событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...