Я создал очень простую игру на платформе 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)