2017-08-09 6 views
-1

問題は非常に簡単です。Java AWT(およびSwing)を使用してゲームを作成していますが、最初のGraphics.drawString(String str, int x, int y)コールは時間がかかりすぎます。私はカスタムフォントなどを設定していません。私はレンダリングのヒントを設定していません。私はMacBook AirでMac Sierra 10.12.4を使用しています。私はWindowsで自分のプログラムをまだテストしていませんでした。それはまったく問題です。Java AWT初期drawString()コールが長くかかります

最小限の例を読むのに時間を費やしたくない場合は、メインメソッドのJFrameに追加するJPanel(および実装可能なランナブル)を拡張するGamePanelというクラスがあります。コンストラクタでゲームスレッドを初期化し、run()メソッドでゲームループを開始します。その後、スイングタイマーを使用してゲームループが繰り返されます。ゲームのループでは、私はpaintComponent(Graphics g)からredraw()まで電話します。テキストはpaintComponentメソッドで描画されます。これは実際に必要な情報ではありません。なぜなら、問題はゲームのループがなくても再現可能で、ゲームのスレッドとpaintComponentの方法だけですから、ここに入れておきます。

何か助けていただければ幸いです。

ゲームクラス(JFrameの)

public class Game { 
    public static JFrame frame; 
    public static JPanel gamePanel; 

    public static void main(String[] args) { 
     frame = new JFrame(""); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.setLayout(new BorderLayout()); 
     gamePanel = new GamePanel(); 
     frame.add(gamePanel, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

GamePanelのクラス(パネル)

public class GamePanel() extends JPanel implements Runnable { 
    public static Thread thread; 

    public GamePanel() { 
     super(); 

     setPreferredSize(new Dimension(640, 480)); 

     setFocusable(true); 
     requestFocus(); 

     if (thread == null) { 
      thread = new Thread(this); 
      thread.start(); 
     } 
    } 

    public void run() { 
     while (! Game.frame.isVisible()) { 
      try { 
       Thread.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     EventQueue.invokeLater(new Runnable() { 
      public void run() {gameLoop();} 
     }); 
    } 

    public void GameLoop() { 
     repaint(); 

     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     gameLoop(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(); 
     g.drawText("Hello World", 10, 10); 
    } 
} 

私は、最小限の例のスピードでゲームループは、刻々と変化する(およびthatsのことになるの正反対を知っています良いゲームループがすべきこと)。しかし、それは最小限の例ではどういうことでしょうか?

答えて

3

これは、別のスレッドから再描画を呼び出すために発生します。イベントディスパッチスレッドについて読むことができます。

Java Event-Dispatching Thread explanation

https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

+0

[OK]を、私はそれを得る...あなたの答えをいただき、ありがとうございます。私は今、別の質問があります。どのように私はgameloopについて行くだろうか? EventDispatchingスレッドでゲームのループ全体を実行できますか? – MaiorExMinor

+0

私はJavaでのゲーム開発についてはあまりよく分かりませんが、私は非常に単純なゲームを作っています。私はEDTのscheduleAtFixedRateでTimerTaskを使ってオブジェクトを更新しました。より複雑で大きなゲームを作成するなら、私はレンダリングを手助けするためのライブラリを用意しています。私は少しlibgdxで遊んだし、私はそれがhttps://libgdx.badlogicgames.com/好きですが、ゲームを作成する過程で、私は私が考える質問に答える正しい人ではありません。幸運と開発を楽しんで! – LanfeaR

+0

新しい編集がこの答えを無関係にするので、私は答えを受け入れませんでした。それでも、ありがとう。 – MaiorExMinor

関連する問題