2017-04-12 75 views
0

我正在使用图像为Java应用绘制背景,这是一个没有重复属性的大应用。为此,我使用bufferedImage来读取资源和图像,并在Canvas中绘制它。那么,它工作得很好。除了一件事,即使形象落后,应用程序仍然会打开。JAVA:为什么图像加载比应用程序,窗口框架更慢?

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

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

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

这里是我的代码:

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(); 
    } 
} 

Game.class

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班,我认为这是有关我的问题。而这段代码确实会加载图片,但加载非常缓慢。

+4

看起来你正在'render()'方法中加载图像。这需要时间。您应该首先加载图像(到内存中),然后用图像显示窗口。 –

+1

您还会发现,在整个节点在屏幕上实现之前,您无法创建BufferedStrategy。我也同意史蒂夫,我建议您提前加载你需要的图片 – MadProgrammer

回答

1

问题在于你的gameloop。在你的图形上下文实际绘制之前,你试图在你的游戏循环的每次迭代中将你的图像文件加载到内存中。

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

你可以在开始你的gameloop之前的任何地方加载图像。

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

最终保存if(bs == null),但这并不会引起任何明显的区别。

相关问题