GUI работает со скоростью 30 кадров в секунду?

При тестировании кода моделирования в реальном времени, использующего Swingworker, я заметил, что мой графический интерфейс всегда работает со скоростью 30 кадров в секунду, не более, не меньше. Я обновляю графический интерфейс каждый раз, когда пользователь взаимодействует с приложением (например, перемещение мыши) или когда вызывается метод process () для Swingworker. Swingworker ничего не делает прямо сейчас, он просто захватывает местоположение мыши из графического интерфейса и отправляет его обратно в качестве клона через методы publish () и process () (я просто делаю это, чтобы увидеть, что я могу и могу при общении между streamами, потому что multithreading для меня все еще нова. У меня нет ни одного таймера в любом месте, метод process () Swingworker вызывает repaint () в графическом интерфейсе, поэтому мне было интересно, что заставляет графический интерфейс обновляться со скоростью 30 кадров в секунду? Может быть, как vsync активен в графическом интерфейсе по умолчанию или это какое-то поведение метода process () в Swingworker? И, наконец: есть ли способ получить более высокие частоты кадров?

Вот sscce, который проявляет такое поведение:

public class SimGameTest implements Runnable { public static void main(String[] args) { SwingUtilities.invokeLater(new SimGameTest()); } @Override public void run() { MainWindow mainWindow = new MainWindow(new Game()); mainWindow.setLocationRelativeTo(null); mainWindow.setVisible(true); } } public class MainWindow extends JFrame { private Game game; private GamePanel gamePanel; public MainWindow(Game game) { this.game = game; createAndShowGUI(); startGame(); } private void startGame() { GameSim gameSim = new GameSim(game, gamePanel); gameSim.execute(); } private void createAndShowGUI() { setTitle("Sim game test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); JPanel contentPane = new JPanel(new GridBagLayout()); gamePanel = new GamePanel(game); contentPane.add(gamePanel); add(contentPane); pack(); } } public class Game { public Point mouseLocation = new Point(); public Point clonedMouseLocation = new Point(); } public class GameSim extends SwingWorker { private Game game; private GamePanel gamePanel; public GameSim(Game game, GamePanel gamePanel) { this.game = game; this.gamePanel = gamePanel; } @Override protected Point doInBackground() throws Exception { while (true) { publish((Point) game.mouseLocation.clone()); } } @Override protected void process(List pointList) { game.clonedMouseLocation = pointList.get(pointList.size() - 1); gamePanel.repaint(); } } public class GamePanel extends JPanel { private Game game; private long lastTime; public GamePanel(Game game) { this.game = game; setPreferredSize(new Dimension(512, 512)); addMouseMotionListener(new GamePanelListener();); } @Override public void paintComponent(Graphics g) { // draw background g.setColor(new Color(0, 0, 32)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(new Color(192, 192, 255)); g.drawString(game.clonedMouseLocation.x + ", " + game.clonedMouseLocation.y, 10, 502); long now = System.nanoTime(); long timePassed = now - lastTime; lastTime = now; double fps = ((double) 1000000000 / timePassed); g.drawString("fps: " + fps, 10, 482); } private class GamePanelListener extends MouseInputAdapter { @Override public void mouseMoved(MouseEvent e) { if (contains(e.getPoint())) { game.mouseLocation = e.getPoint(); } } } } 

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

Оказывается, SwingWorker экземпляры Runnable в EventQueue с помощью javax.swing.Timer с точно такой DELAY .

 private static class DoSubmitAccumulativeRunnable extends AccumulativeRunnable implements ActionListener { private final static int DELAY = (int) (1000 / 30); ... } 

Вы можете получить более высокую частоту кадров, но не с javax.swing.SwingWorker . Вы можете построить SwingWorker из источника , но в итоге вы SwingWorker stream с помощью экземпляров Runnable . Один из вариантов заключается в том, чтобы запустить модель и выставить ее периодически, как показано здесь .

  • Установка свойства Style метки WPF в коде?
  • Редактор графического редактора Netbeans, создающий собственный непонятный код
  • Безопасно ли создавать виджеты Swing / AWT NOT на тему Dispatch Event?
  • Один или несколько ресурсов имеют цель «голова», но не «головной» компонент был определен в представлении
  • Добавление JPanels от других classов к cardLayout
  • Как создать RecyclerView с несколькими типами просмотра?
  • Qt сигнализирует по streamам, один - stream GUI?
  • Android: что выбрать для значений кода запроса?
  • Более эффективный способ обновления пользовательского интерфейса от службы, чем намерения?
  • Картина не клиента на окне аэрозона
  • Доступ к компонентам GUI из другого classа
  • Давайте будем гением компьютера.