Вызывает ли BufferStrategy странные падения FPS в моей игре на Java? - PullRequest
0 голосов
/ 04 июня 2019

Я создал очень простую игру на платформе Java с использованием AWT и Swing (она расширяет Canvas), которая отлично работает при первой загрузке, но иногда, когда игра перезагружается (например, после смерти), fps падает с 60-100 + примерно до 1. Если вы продолжаете перезагружать игру, она иногда уходит, но обычно остается.

Когда игра запускается с помощью отладчика NetBeans, сбросы FPS менее серьезны и их труднее воспроизвести. Иногда (не всегда), когда игра перезагружается и у нее выпадает FPS, я получаю исключение «java.lang.IllegalStateException: у компонента должен быть действительный узел», связанный с BufferStrategy (я вставил полное исключение внизу).

Насколько я могу судить (и я далеко не эксперт в этом), это не связано с утечкой памяти, потоками или дополнительными игровыми объектами (оставленными после предыдущих запусков), поэтому я подозреваю, что имеет какое-то отношение к BufferStrategy. Кто-нибудь знает, как это исправить? Заранее спасибо!

/** The render function */
private void render() {
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null) {            
            this.createBufferStrategy(3);         
            return;
        }

        Graphics g = bs.getDrawGraphics();
        Graphics2D g2d = (Graphics2D) g;

        --- code for stuff to draw removed ---


        g.dispose();
        bs.show();
    }

/** Function for reloading the level when pressing the enter key */
        if(key == KeyEvent.VK_ENTER) {                   
                    JFrame frame = (JFrame) SwingUtilities.getRoot(game);
                    game.setRunning(false); // This stops the game's thread.
                    try {
                        // Added delay to avoid IllegalStateException: Buffers have not been created.      
                        TimeUnit.MILLISECONDS.sleep(400);            

                        frame.dispose();

                    } catch (InterruptedException ex) {
          Logger.getLogger(KeyInput.class.getName()).log(Level.SEVERE, null, ex);
                    }
                   //Starts a new JFrame window with the game in it as a component.
                    Window w = new Window(1200, 900, "Super Sisters", new Game(Game.getSister())); 

                }


Exception in thread "Thread-$$" java.lang.IllegalStateException: Component must have a valid peer
    at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:4067)
    at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:4050)
    at java.awt.Component$FlipBufferStrategy.revalidate(Component.java:4165)
    at java.awt.Component$FlipBufferStrategy.revalidate(Component.java:4147)
    at java.awt.Component$FlipBufferStrategy.getDrawGraphics(Component.java:4139)
...