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 не является проблемой.
- Анимированная анимация Blackberry
- JButton ActionListener - обновление GUI только после нажатия JButton
- ProgressBar в Javafx не обновляется в блоке onAction
- Android ViewPager с нижними точками
- Как создать графический интерфейс пользователя на C ++?
- Рамки графического интерфейса Java. Что выбрать? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot?
- Чтение из текстового поля в другом приложении
- Список нескольких вариантов с пользовательским представлением?
- JTable Right Align Header
- SwingWorker, Thread.sleep () или javax.swing.timer? Мне нужно «вставить паузу»,
- Как я могу проверить, видимо ли это вид или нет в Android?
- Как реализовать перетаскиваемую вкладку с помощью Java Swing?
- Удалить границу нижней границы в панели вкладок? (И изменить выбранный цвет)
Оказывается, 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
. Один из вариантов заключается в том, чтобы запустить модель и выставить ее периодически, как показано здесь .