Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中有没有什么有效的JFrame替代方案?_Java_Performance_Swing_Awt_Processing Efficiency - Fatal编程技术网

Java中有没有什么有效的JFrame替代方案?

Java中有没有什么有效的JFrame替代方案?,java,performance,swing,awt,processing-efficiency,Java,Performance,Swing,Awt,Processing Efficiency,我正在用Java编写一个游戏,想把它导出到功能较弱的机器上,我已经知道了如何将它导出到其他平台上,但是当在功能较弱的机器上运行时,它会让它们变得更热。我对代码进行了一些检查,发现在调用此类中的JFrame对象时存在问题: import java.awt.Canvas; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; public class Display { privat

我正在用Java编写一个游戏,想把它导出到功能较弱的机器上,我已经知道了如何将它导出到其他平台上,但是当在功能较弱的机器上运行时,它会让它们变得更热。我对代码进行了一些检查,发现在调用此类中的JFrame对象时存在问题:

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class Display {

    private JFrame frame;
    private Canvas canvas;

    private int screenWidth;
    private int screenHeight;

    public Display(int width, int height) {
        this.screenHeight = height;
        this.screenWidth = width;
        makeDisplay();
    }

    public void makeDisplay() {
        frame = new JFrame();
        frame.setVisible(true);
        frame.setSize(screenWidth, screenHeight);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/GameIcon.png")));;

        canvas = new Canvas();
        canvas.setPreferredSize(new Dimension(screenWidth, screenHeight));
        canvas.setMinimumSize(new Dimension(screenWidth, screenHeight));
        canvas.setMaximumSize(new Dimension(screenWidth, screenHeight));
        canvas.setFocusable(false);

        frame.add(canvas);
        frame.pack();
    }

    public JFrame getFrame() {
        return frame;
    }

    public Canvas getCanvas() {
        return canvas;
    }

}

当我在类中删除JFrame实例时,性能会显著提高。因此,我的问题是,如何使这段代码更高效,或者是否有一种更有效的方法可以在我的代码中使用类似于JFrame的东西。

我研究了其他使图形高效地出现在Java中的方法,并得出结论,JavaFX是一种可行的方法。我已经在我的主要功能中实现了它,代码现在使用了您发布的代码,但没有任何作用。如果您有性能问题,问题将在于您的游戏逻辑。使用JFrame remove,您的应用程序不会产生任何视觉效果,对吗?速度更快并不奇怪。这是真的,但我认为必须有一种更有效的方法来创建一个用Java绘制的屏幕,我只使用游戏逻辑运行代码,它根本不占用太多处理能力,所以我想知道在Java中是否有更有效的处理图形的方法。@JacobInwald当然有Graphics2D,JavaFX,一系列OSS Java游戏引擎。你需要做一些研究。无论如何,创建屏幕不是罪魁祸首,除非你对每一帧都这样做:D.第一次这样做时,会加载一堆类,这需要一些时间;然而,问题要么在于你的游戏逻辑,要么在于你的绘画——你都没有向我们展示过。请在问题中添加相关部分和/或进行一些测量。
import java.io.IOException;
import battlegame.graphics.Assets;
import battlegame.input.KeyboardController;
import battlegame.world.World;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;

public class Game extends Application{

    public static int screenWidth = 1248;
    public static int screenHeight = 624;

    private Canvas canvas;
    private Stage stage;
    private Scene scene;
    private Group group;
    private GraphicsContext g;
    private final LongProperty lastUpdateTime = new SimpleLongProperty(0);
    private static World currentWorld;
    private static KeyboardController keyController;

    public Game() {
        keyController = new KeyboardController();
    }

    public void begin(String args[]) {
        launch(args);
    }

    public void initialise() throws IOException {
        canvas = new Canvas(screenWidth, screenHeight);
        group = new Group(canvas);
        scene = new Scene(group);
        g = canvas.getGraphicsContext2D();
        Assets.init();
        currentWorld = new World("/testlvl.txt");
        currentWorld.init();

    }

    @Override
    public void start(Stage primaryStage)throws Exception {
        initialise();
        final AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long timestamp) {
                if (lastUpdateTime.get() > 16.6666666667) {
                    tick();
                    render();
                }
                lastUpdateTime.set(timestamp);
            }
        };
        stage = primaryStage;
        stage.getIcons().add(new Image(Game.class.getResourceAsStream("/GameIcon.png")));
        stage.setScene(scene);
        stage.setResizable(false);
        stage.setOnCloseRequest(event -> {
            timer.stop();
        });
        stage.show();
        scene.addEventHandler(KeyEvent.KEY_PRESSED, (key) -> {
              if(key.getCode() == KeyCode.W || key.getCode() == KeyCode.UP || key.getCode() == KeyCode.SPACE) {
                  keyController.up = true;
              }
              if(key.getCode() == KeyCode.A || key.getCode() == KeyCode.LEFT) {
                  keyController.left = true;
              }
              if(key.getCode() == KeyCode.S || key.getCode() == KeyCode.DOWN) {
                  keyController.down = true;
              }
              if(key.getCode() == KeyCode.D || key.getCode() == KeyCode.RIGHT) {
                  keyController.right = true;
              }
              if(key.getCode() == KeyCode.Z || key.getCode() == KeyCode.O || key.getCode() == KeyCode.ENTER) {
                  keyController.select = true;
              }
              if(key.getCode() == KeyCode.P || key.getCode() == KeyCode.X) {
                  keyController.action = true;
              }

        });

        scene.addEventHandler(KeyEvent.KEY_TYPED, (key) -> {
              if(key.getCode() == KeyCode.W || key.getCode() == KeyCode.UP || key.getCode() == KeyCode.SPACE) {
                  keyController.up = true;
              }
        });

        scene.addEventHandler(KeyEvent.KEY_RELEASED, (key) -> {
              if(key.getCode() == KeyCode.W || key.getCode() == KeyCode.UP || key.getCode() == KeyCode.SPACE) {
                  keyController.up = false;
              }
              if(key.getCode() == KeyCode.A || key.getCode() == KeyCode.LEFT) {
                  keyController.left = false;
              }
              if(key.getCode() == KeyCode.S || key.getCode() == KeyCode.DOWN) {
                  keyController.down = false;
              }
              if(key.getCode() == KeyCode.D || key.getCode() == KeyCode.RIGHT) {
                  keyController.right = false;
              }
              if(key.getCode() == KeyCode.Z || key.getCode() == KeyCode.O || key.getCode() == KeyCode.ENTER) {
                  keyController.select = false;
              }
              if(key.getCode() == KeyCode.P || key.getCode() == KeyCode.X) {
                  keyController.action = false;
              }     });



        timer.start();   
    }


    public void tick() {
        keyController.tick();
        currentWorld.tick();

    }

    public void render() {
        g.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
        currentWorld.render(g);
    }

    public static void main(String[] args){
        launch();
    }

    public static KeyboardController getKeyController(){
        return keyController;
    }

    public static World getCurrentWorld() {
        return currentWorld;
    }



    }