- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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 是最佳选择。我已经在我的 Main 函数中实现了它,根据任务管理器,代码现在使用了 <3% 的 CPU(我有 Intel Core i7 第八代)。下降了大约 13 个百分点,因此我认为这是在提高代码效率方面向前迈出的一大步。快速说明一下,KeyManager 类仅保留已按下或未按下箭头键的 boolean 值,而 World 类则包含所有游戏逻辑。下面是实现 JavaFX 的代码:
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;
}
}
关于java - Java 中有 JFrame 的有效替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58172946/
我不完全确定我理解 substitute 的作用,尽管我以前在它的代码中使用过。今天在shiny::exprToFunction中遇到了如下几行代码: function (expr, env = pa
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我最近发现了 crockford 的 Javascript supplant 函数。函数是这样的—— if (!String.prototype.supplant) { String.prot
在我工作的一些项目中,添加了一些具有这种语法的 block : var [code, name] = input.split("/"); console.log(code); console.log(
我对 JavaBeans 模式的憎恨就像一千个太阳的火焰一样燃烧。为什么? 冗长。现在是 2009 年。我不应该为一个属性写 7 LOC。如果他们有事件监听器,请捕获你的帽子。 没有类型安全的引用。没
是否有比 PHP 执行速度更快且具有相同功能集(例如对常见 RDBMS、Curl、Regex 等的支持)的替代品? 用 C 编写网站代码怎么样?效果如何?该平台是否独立并在每台服务器上运行? 最佳答案
我正在开始新项目。客户端界面基于 GWT(和 GXT),我没有说它是预先确定的。但是,我可以选择服务器端,这样我就可以玩得开心,并希望在这个过程中学到一些新东西。一些要求是: 与服务器的交换将通过使用
我目前使用 CentOS 5.6(Ghostscript 8 - ImageMagick-6.2.8) 我正在尝试将 pdf 的第一张图像转换为 jpg 文件。 我知道我当前的设置无法转换压缩的 pd
2021 年更新: 只使用 MathJax;您不应该再支持旧版本的 IE。 我想使用 MathJax 来显示 MathML 方程,但它在 IE 中的性能慢得令人无法接受(是的,我读过使用 Emulat
BinaryFormatter 序列化的 128³ 数组加倍,占用 50 MB 空间。序列化具有两个双字段的 128³ 结构数组需要 150 MB 和超过 20 秒的处理时间。 是否有快速简单的替代方
我发现 $.each 非常慢,如果包含大量各种 jQuery 效果,会给网页带来问题。 我想知道 $.each 是否有一个好的替代方案,例如: $('ul li').each(function() {
我正在编写一个Mac应用程序,它提供类似“测试”的功能。此应用程序(通过与服务器的连接)。基本上,该应用程序将为学生提供一个故事供阅读,然后是一系列问题(也来自服务器),用户可以(尝试)选择正确的答案
我喜欢 WPF,但我讨厌 XAML。 XAML 过于冗长,在 Microsoft 尝试对其进行扩展时出现语法问题(请参阅 StringFormat on Bindings),并且难以导航。 XAML
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足 Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以
有没有类似 SoftwareFx 的 PowerGadgets 的产品?我正在查看支持自动刷新的 powershell 的仪表控件。 最佳答案 检查 ShowUI 模块。 http://showui.
我正在开发一个项目,其中页面需要能够根据服务器的状态保持更新。 我喜欢 websocket,因为它们为我提供了一种从服务器推送消息的方法,但可用性是一个问题。 我需要通用方法在网络服务器和浏览器客户端
我最近一直在使用 openX 自托管广告管理软件,但它太慢了。 目标:我需要能够展示一个广告,获得 10 次点击,然后停用该广告,并且每天都这样做。 问题:当我将 openX 设置为每天 10 次点击
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在尝试实现一个简单的类,该类允许用户裁剪用于其个人资料图片的图像。这是一个 Java Web 应用程序。 我做了一些搜索,发现 java.awt 有一个 BufferedImage 类,这看起来(
只是一个关于 JQuery 的简单问题,我一直在使用phonegap 并使用 JQuery 制作了一些应用程序。其中一个运行速度非常慢,所以我一直在努力尽可能地精简它。 我一直在考虑的一个更改是用更小
我是一名优秀的程序员,十分优秀!