JAVA:为什么图像加载速度比应用程序、Window Frame 慢?

标签 java image canvas bufferedimage

我正在使用一张图像为 Java 应用程序绘制背景,这是一个没有重复属性的大背景。为此,我使用 bufferedImage 来读取资源、图像,并将其绘制在 Canvas 中。嗯,它工作得几乎没问题。除了一件事之外,即使图像落后,应用程序仍然会打开。

我的意思是,我希望看到应用程序和图像同时加载。但似乎图像只是在应用程序启动后才加载,足够长的时间可以看到窗口框架背景(灰色,因为我使用的是 Windows 10)。

因此,在初始化 Canvas 类后,我通过 setVisible(true); 尝试了我的解决方案。结果还是一样。

还有一个异常(exception),我不知道它是否与图像相关。但在我关闭应用程序后,控制台抛出了一个名为“已关闭”的异常。就像我关闭应用程序后,我的部分代码仍在运行并尝试读取图像。

这是我的代码:

App.class(这里是主类)

import engine.MouseAction;
import graphic.Game;
import graphic.Window;

public class App {
    MouseAction mouse;
    Game game;
    Window window;

    App() {
        init();
        setup();
        window.launch();//It's just window.setVisible(true);
    }

    private void init() {
        mouse = new MouseAction();

        game = new Game();
        window = new Window(game, mouse);
    }

    private void setup() {
        mouse.setWindow(window);
        game.start();
    }

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

游戏.类

package graphic;

import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

import engine.Config;

public class Game extends Canvas implements Runnable {
    private static final long serialVersionUID = -545327428912119369L;

    private Thread thread;
    private boolean running = false;

    public Game() {}

    public synchronized void start() {
        thread = new Thread(this);
        thread.start();
        running = true;
    }

    public synchronized void stop() {
        try {
            thread.join();
            running = false;
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private void update() {

    }

    private void render() {
        BufferStrategy bs = getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }

        Graphics2D g = (Graphics2D) bs.getDrawGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);

        try {
            BufferedImage bg = ImageIO.read(getClass().getResource("/assets/img/bg.jpg"));
            g.drawImage(bg, 0, 0, Config.SOL_16x10_small.width, Config.SOL_16x10_small.height, this);
            bg.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

        g.dispose();
        bs.show();
    }
    public void run() {
        long lastTime = System.nanoTime();
        final double amountOfTick = 60.0;
        double ns = 1000000000 / amountOfTick; //It's nano second
        double delta = 0;

        while (running) {
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                update();
                delta--;
            }
            render();
        }

        stop();
    }

}

这是 2 个类,我认为它与我的问题相关。这段代码确实加载了图像,但加载速度非常慢。

最佳答案

问题出在你的游戏循环中。您尝试在游戏循环的每次迭代中将图像文件加载到内存中,然后再获取图形上下文来实际绘制它。

尝试预先将图像加载到内存中,然后只需调用 Graphics g 的绘图方法即可在每次迭代时渲染它。

您可以在开始游戏循环之前将图像加载到任何位置。

您还可以预先创建 bufferstrategy,然后简单地在 render() 方法中获取图形上下文,就像您已经这样做的那样。

最终保存 if(bs == null),但这不会产生任何明显的差异。

关于JAVA:为什么图像加载速度比应用程序、Window Frame 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364448/

相关文章:

java - 如何比较两个 HashMap<String, List<String>>

image - 如何从位图创建透明 png 图像?

javascript - 为什么 toDataUrl() 乘法器对 Fabric.js 不起作用?

java - 重写规则附加 webapp 上下文路径与 <spring :url> and <c:url> taglibs 冲突

java - JSP 当前 URL

java - HttpsURLConnection默认请求方式

c - 使用 C 程序去除背景和检测形状

python - 使用 PythonMagick 从 pdf 更改为图像时图像质量下降

javascript - KineticJS 在 Jsfiddle 中工作,而不是在我的网站上工作

Facebook Canvas 应用程序 : Force SSL