2017-04-12 2 views
0

私はJavaアプリの背景を描画するためにイメージを使用しています。これを行うために、私はbufferedImageを使用して、リソース、イメージを読み込み、キャンバスに描画しました。まあ、それはほぼ正常に動作します。 1つのことを除いて、イメージが後ろに落ちても、アプリはまだ開きます。JAVA:画像がアプリケーション、ウィンドウフレームよりも遅く読み込まれるのはなぜですか?

私は、アプリと画像の両方が同時に読み込まれることを期待していました。しかし、画像がアプリケーションが起動した後に読み込まれただけで、ウィンドウフレームの背景(Windowsの10を使用しているため灰色の色)を表示するのに十分なようです。

Canvasクラスが初期化された後、setVisible(true);で私の解決策を試しました。結果は変わりません。

もう1つの例外は、画像に関連するかどうかわかりません。しかし、私はアプリを終了した後、コンソールは 'クローズド'と呼ばれる例外をスローしました。私のアプリケーションを閉じた後のように、まだコーディングの一部が実行されており、画像を読み込もうとしています。

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

問題はあなたのカメループにあります。グラフィックスコンテキストを実際に描画する直前に、ゲームキューの繰り返しごとにイメージファイルをメモリにロードしようとします。

イメージをあらかじめメモリにロードしてから、グラフィックスgの描画メソッドを呼び出してすべての繰り返しで描画するようにしてください。

ガメロップを起動する前にイメージをロードすることができます。

事前にバッファーストラテジーを作成しておけば、すでに行っているように、render()メソッドでグラフィックスコンテキストを取得することもできます。

最終的にif(bs == null)を保存すると、目立った違いはありません。

関連する問題