Объединение Java Swing и Java3D: проблемы производительности с параллелизмом

Я объединяю Swing и Java3D вместе. Манипуляции с компонентами Swing должны выполняться с помощью потока диспетчера событий, а манипуляции с компонентами Java3D должны выполняться в BehaviourSchedulerThread.

Java3D визуализирует сцену, а затем выполняет все действия, связанные со сценой.

У меня включен MouseListener на Canvas3D. События помещаются в очередь событий AWT. Затем я хочу изменить среду Java3D на основе этих событий, поэтому я использую специальное поведение, в котором я могу опубликовать Runnable. Это гарантирует, что Runnable выполняются во время цикла Behavior Java3D (и не изменяют ничего во время цикла Render).

Предположим, что некоторые операции в поведении хотят изменить модель Swing. Затем мне нужно отправить новый Runnable в EDT.

Это правильный способ сделать это?

Используя эту технику, я испытываю множество проблем с обработчиком мыши. Я обновляю точку в своей модели Java3D в поведении и одновременно обновляю графический интерфейс Swing.

Обновление : Проблема может быть более четко определена следующим образом:

У меня есть «спиновый куб» JButton, который имеет ActionListener. После запуска ActionListener подталкивает AWTEvent к Java3D Behavior.Как только Behavior запускается, он изменяет граф Scene, а затем изменяет JButton actionListener и текст, чтобы он стал «Stop spinning».

  1. Дважды щелкните JButton.
  2. Первое событие AWTE отправляется в SpinActionListener. Куб начинает вращаться, и JButton actionListener изменяется на StopSpinningActionListener .
  3. Второе событие AWTE отправляется в StopSpinningActionListener. Куб перестает вращаться, и JButton actionListener изменяется на SpinActionListener .

На самом деле происходит следующее:

  1. Дважды щелкните JButton. Оба события AWTEvent отправляются в SpinActionListener . Это создает Runnable для выполнения внутри J3D Behavior.
  2. Первое событие AWTEvent запускает таймер для вращения куба. Затем он отправляет Runnable в EDT, чтобы изменить кнопку.
  3. Второе событие AWTEvent запускает таймер для вращения куба. Теперь куб будет вращаться в два раза быстрее. Затем он отправляет Runnable в EDT, чтобы изменить кнопку.

Очевидно, я не должен зависеть от последовательной обработки AWTEvent. Я не могу ждать в EDT, пока сработает поведение, потому что любой SwingUtilities.invokeAndWait () вызовет тупик.

10
задан parasietje 16 January 2012 в 11:17
поделиться