Javaプログラミング

トップページ      |      目次
←前へ      次へ→

  • 描画処理の改善
    • 画面描画とちらつき(フリッカー)
      • Frameなどは一定間隔(リフレッシュレート)で更新(再描画される)
      • ※グラフィックスやアニメーションの項を参照
      • 画面への描画処理は比較的時間がかかるので、大量の描画や画面更新間隔が短いと描画処理が間に合わずちらつき(フリッカー)が発生する
      • 実行結果
      • マシンの性能にもよるが、以下のプログラムでは四角形の描画が間に合わずちらつきが発生する(※点滅に注意)
      • 
                  import java.awt.Color;
                  import java.awt.Graphics;
                  
                  import javax.swing.JFrame;
                  
                  public class Flicker{
                    public Flicker(){
                      JFrame f=new JFrame();
                      f.setTitle("Graphics Test");
                  
                      f.setBounds(200,200,320,240);
                      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      f.setVisible(true);
                  
                      //フレームに描画する準備
                      Graphics g=f.getGraphics();
                  
                      //色を赤に設定
                      g.setColor(Color.red);
                  
                      //四角を描画(塗りつぶし)
                      while(true) {
                        g.clearRect(0, 0, 320, 240);
                        for(int y=0;y<10;y++) {
                          for(int x=0;x<<0;x++) {
                            g.fillRect(x*30+10, y*30, 20, 20);
                          }
                        }
                      }
                    }
                  
                    public static void main(String[] args){
                      new Flicker();
                    }
                  }
              
        • 実行結果
        • 実行結果 GIF画像

    • ダブルバッファリング
      • バッファ領域(オフスクリーン)に描画するイメージを予め描画しておいて、画面更新時に描画領域に転送することでちらつきの発生を抑える
      • 
                        import java.awt.Color;
                        import java.awt.Graphics;
                        import java.awt.Image;
                        
                        import javax.swing.JFrame;
                        
                        public class DoubleBuffering{
                          public DoubleBuffering(){
                            JFrame f=new JFrame();
                            f.setTitle("Graphics Test");
                        
                            f.setBounds(200,200,320,240);
                            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            f.setVisible(true);
                        
                            //オフスクリーン用領域の作成
                            Image buffer=f.createImage(320, 240);
                        
                            //フレームに描画する準備
                            Graphics fg=f.getGraphics();
                            Graphics bg=buffer.getGraphics();
                        
                            //色を赤に設定
                            bg.setColor(Color.red);
                        
                            //四角を描画(塗りつぶし)
                            while(true) {
                              bg.clearRect(0, 0, 320, 240);
                              for(int y=0;y<10;y++) {
                                for(int x=0;x<10;x++) {
                                  bg.fillRect(x*30+10, y*30, 20, 20);
                                }
                              }
                              fg.drawImage(buffer, 0, 0, null);
                            }
                          }
                        
                          public static void main(String[] args){
                            new DoubleBuffering();
                          }
                        }                
                    
        • 実行結果
        • 実行結果


←前へ      次へ→