Javaのダブルバッファリングについてお伺いしたいです

このQ&Aのポイント
  • Javaのダブルバッファリングについてお伺いしたいです。オブジェクトの数が多いことがチラつきの原因でしょうか?
  • Javaのダブルバッファリングについてお伺いしたいです。5秒おきに生じるチラつきの原因は何でしょうか?
  • ダブルバッファリングの実装により、Javaの描画パフォーマンスを改善することができます。しかし、オブジェクトの数が多くなるとチラつきが生じることがあります。
回答を見る
  • ベストアンサー

Javaのダブルバッファリングについてお伺いしたいのですが、

Javaのダブルバッファリングについてお伺いしたいのですが、 Thred.sleep(20) ペイント部 public void paint(Graphics g) { g.drawImage(wbuffer, int x, int y, this); } アップデートメソッド public void update(Graphics g) { paint(g); } 他のクラスからもこのwbufferの中にいったん書き込むようにしています。 チラつきが出る要因として考えられるのはどんなことがあるのでしょうか? ・オブジェクトの数が多い というのが原因でしょうか。 だいたい5秒おきくらいにチラつきが生じます。

  • Java
  • 回答数2
  • ありがとう数13

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

くわしくないけど、 とりあえずこれとか。 http://javagame.skr.jp/index.php?%A5%A2%A5%AF%A5%C6%A5%A3%A5%D6%A5%EC%A5%F3%A5%C0%A5%EA%A5%F3%A5%B0 これでダメならソースコードをどこかにアップするとか。

kiraristar
質問者

お礼

ありがとうございます。 早速、試してみます。

その他の回答 (1)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

wbufferの中身の更新と、このpaint <- update <- repaintの呼ばれ方の、タイミングが分からないと、なんとも答えられません。

参考URL:
http://homepage1.nifty.com/algafield/paint.html
kiraristar
質問者

補足

ありがとうございます。 ************************************************* private Image wbuffer; wbuffer = createImage(W, H); v = wbuffer.getGraphics(); ************************************************* 以下runメソッドです ************************************************* public void run(){ while(thisThread == Thread.currentThread()){ if(step == 0){ step0(); } else if(step == 1){ step1(); } repaint(); try{ Thread.sleep(20); } catch(InterruptedException e){ break; } } } ************************************************* ※このstep1()の中で下記の更新を行っています。 for(int j=0; j<List.size(); j++){ Cha c = (Cha)(List.elementAt(j)); c.draw(v); } } ※Chaというクラスが存在します。 ※Listは可変長配列です。

関連するQ&A

  • ダブルバッファリング

    ダブルバッファリングを使ったつもりですが、キー操作するたびに画面がチカチカします。 特に <applet code="test.class" width="1600" height="600"> とした場合、repaint()メソッドを何回も呼んだ時に激しいです。 以下、ソースですが間違っているでしょうか? // ダブルバッファリング private Image imgOff; // オフイメージ private Graphics graOff; // オフグラフィックス public void paint(Graphics g){ if (imgOff == null) { Dimension dim = getSize(); imgOff = createImage( dim.width, dim.height ); graOff = imgOff.getGraphics(); } // ここに何か書く 例) graOff.setColor( new Color(255,255,255) ); graOff.fillRect(0, 0, 1600, 600); // 画面に反映 g.drawImage(imgOff,0,0,this); }

    • ベストアンサー
    • Java
  • java ダブルバッファリングするがちらつく

    javaでゲームをつくろうかと考えています。 そこで、ダブルバッファリングを実装したのですが、ちらついてしまいます。 いろいろ検索をかけて調べたのですが、これ以上改善が見込めないので 質問します。 以下がソースコードです。 画面がちらつくので、画面のリフレッシュレートが関係しているのかわからず、 しかし、ふつうにjava applet でゲームがあるので、多分どこかが間違っていると思います。 ご指摘をお願いします。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.net.URL; /*<applet code="applet01" width="320" height="480"></applet>*/ public class applet01 extends Applet implements KeyListener, Runnable { String text = ""; Image image; int x = 100, y = 100; KeyInput key; Image image弾; Bullet bullet; int flag_x = 1; Image backbuffer; Graphics ct; Dimension dim; // 初期化 public void init() { // image = getImage( getDocumentBase(), "test.jpg" ); image = getImage( getCodeBase(), "test.jpg" ); image弾 = getImage( getCodeBase(), "弾.jpg" ); bullet = new Bullet(); key = new KeyInput(); dim = getSize(); backbuffer = createImage( dim.width, dim.height ); ct = backbuffer.getGraphics(); Thread th = new Thread( this ); th.start(); addKeyListener( this ); requestFocus(); } // public void run() { try { while(true) { repaint(); Thread.sleep(1000/60); if( x>640 ) flag_x = 1; if( x<0 ) flag_x = 0; if( 1 == flag_x ) x--; if( 0 == flag_x ) x++; } } catch( Exception err ) { } } // 描画 public void paint( Graphics g ) { ct.setColor( Color.white ); ct.fillRect( 0, 0, dim.width, dim.height ); ct.setColor( Color.red ); ct.fillRect( (dim.width/2)-50 , (dim.height/2)-50, x, y ); // 裏画面に描画 ct.drawString( "画面をクリックしてキーボードで操作できます。", 0, 20 ); ct.drawString( "Hello from Java!", 60, 100 ); ct.drawImage( image, x, y, this ); bullet.Draw( ct, this, image弾 ); // 裏画面を表に反映 g.drawImage( backbuffer, 0, 0, this ); } // キーの入力があったとき public void keyTyped( KeyEvent e ) { repaint(); } // キーが押されたとき public void keyPressed( KeyEvent e ) { key.keyPressed( e ); if( key.isPressing( KeyEvent.VK_UP ) ) y = y - 5; if( key.isPressing( KeyEvent.VK_DOWN ) ) y = y + 5; if( key.isPressing( KeyEvent.VK_LEFT ) ) x = x - 5; if( key.isPressing( KeyEvent.VK_RIGHT ) ) x = x + 5; if( KeyEvent.VK_UP == e.getKeyCode() ) y = y - 5; if( KeyEvent.VK_Z == e.getKeyCode() ) { bullet.x = x; bullet.y = y; } repaint(); } // キーが放されたとき public void keyReleased( KeyEvent e ) { key.keyReleased( e ); } }

    • ベストアンサー
    • Java
  • ダブルバッファリングについて

    Javaで時計を作成していますが、 裏画面への作画がうまくいきません。 コンパイルはできますが、実行すると以下のエラーがでます。  Exception in thread "main" java.lang.NullPointerException   at AnalogClock.<init>(AnalogClock.java:22)   at AnalogClock.main(AnalogClock.java:54) オブジェクトが必要なときに、アプリケーションがnullを返すと、この例外がでることはわかりましたが、どうしてアプリケーションがnullを返すのかがわからず困っています。 プログラムは、表画面に直接表示するとちゃんとでます。 どなたか教えて頂けるとうれしいです。よろしくお願いします。 7)public class AnalogClock extends Frame implements Runnable { 8) 9) Calendar cal; 10) Image backimg; 11) Graphics bg; 中略 19) AnalogClock() { 20)//ダブルバッファリング用裏画面 21) backimg = createImage(width,height); 22) bg = backimg.getGraphics(); 23) setBackground(Color.black); 24) } 25) 26) public void paint(Graphics g) { 27)//カレンダーの取得(時・分・秒) 28) cal = Calendar.getInstance(); 29) hour = cal.get(cal.HOUR); 30) min = cal.get(cal.MINUTE); 31) sec = cal.get(cal.SECOND); 32)//時計の文字盤を作画 33) //文字盤の作画開始座標 34) x = 50; 35) y = 50; 36) //文字盤の直径 37) across = 200; 38) bg.setColor(Color.yellow); 39) bg.fillOval(x,y,across,across); 40)//裏画面のイメージを面画面に作画 41) g.drawImage(backimg,0,0,null); 42) } 中略 53) public static void main(String[] args) { 54) final AnalogClock ac = new AnalogClock(); 55) Thread th = new Thread(ac); 56) th.start(); 57) ac.setSize(300,300); 58) ac.setVisible(true); 以下略 (左の数字は行数です)

  • .Net Compact でのダブルバッファリング

    .Net Comapct Frameworkを利用してのC#プログラミングで、 ダブルバッファリングを利用して画面を描画しようとしていますが、 ちらつきが解消されません。 どこがおかしいかご指摘いただけると幸いです。 【環境】 Visual Studio 2005 C# .Net Compact Framework 2.0 【コード(抜粋)】 public partial class Form1 : Form { private Bitmap m_offScr; // オフスクリーンイメージ private Graphics m_offG; // オフスクリーングラフィックス private System.Windows.Forms.Timer timer1; public Form1() { this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); ~略~ this.m_offScr = new Bitmap(400, 200); this.m_offG = Graphics.FromImage(this.m_offScr); } private void Form1_Paint(object sender, PaintEventArgs e) { m_offG.FillRectangle(new SolidBrush(Color.Red), 10, 10, 100, 100); e.Graphics.DrawImage(this.m_offScr, 0, 0); } // イベントハンドラ private void timer1_Tick(object sender, EventArgs e) { // 秒の更新 this.Refresh(); } } よろしくお願いいたします。

  • Javaを説明するには

    4枚の絵をパラパラアニメにするソースなのですが。これをわけ合って説明しなくてはならなくなってしまいました。 薄らぼんやりとはわかるのですが。どう説明したらいいのかさっぱり分かりません、どう説明すれば、分かりやすく正しく伝えられるでしょうか?>< import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class DNA extends Applet implements Runnable, ActionListener { Image image[] = new Image[4]; int[] timing = { 400,350,230,350}; Thread t; int index1 = 0; int no = 0; private static final long serialVersionUID = 1L; public void init(){ for(int i = 0; i<4; i++){ image[i] = getImage(getDocumentBase(),"img"+(i)+".gif"); } } public void paint(Graphics g){ g.drawImage(image[index1],0,0,this); } public void update(Graphics g) { paint(g); if(++no==4)no=0; } public void start(){ t = new Thread(this); t.start(); } public void run() { while(true){ index1++; if(index1 == 4){ index1 = 0; } repaint(); try{ Thread.sleep(timing[no]); }catch(InterruptedException e){} }} public void actionPerformed(ActionEvent arg0) { } }

  • public void paint(Graphics g){

    public void paint(Graphics g){ g.setColor(new Color(ci, ci, ci)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.WHITE); g.drawString("Canvas表示", 20, 20); g.drawImage(image, x1, y1, this); g.drawImage(image1, x2, y2, this); } public void update(Graphics g){ paint(g); } public void run(){         //while(true)で永久ループ //imageの座標を変更する処理         //repaint();     } スレッドを使ってイメージの座標を変更し、イメージが動くプログラムを作りました。 これだと滑らかに動かないからpaintメソッドをもうひとつ作って 処理するpaintと描画するpaintとにわけたらいいと言われました。 ですがやりかたがわからないので教えてください。

  • javaのエラーの意味がわかりません、お願いします

    今日は、javaを勉強している初心者です。 以下のコードを書いてやりましたが、「sleep(Graphics)は引数()に適用できません」、「Color.Whiteを解決できません」とエラーがでます、エラーの意味が分かりません。 一体何処が間違っているのでしょうか、宜しくお願いします。 ===================================================================== public class ani_Moving_Ball extends Applet { int x; public void paint(Graphics g) { for(x=0 ; x<180 ; ++x) { clear(g); g.drawOval(x,90,19,19); sleep(); } } public void clear(Graphics g) { g.setColor(Color.White); g.fillRect(0,80,200,40); g.setColor(Color.Black); } public void sleep(Graphics g) { double s=0.0; for (int j=1 ; j<100 ; ++j) { for (int k=1 ; k<100 ; ++k) { s =+ Math.sin((double)j); } } } }

    • ベストアンサー
    • Java
  • java ME MIDPにおいて

    java ME MIDPにおいて Canvasクラスの public void paint(Graphics g){ g.setColor(255,255,255);} で、メインのMIDletクラスが 起動すると自動でpaintが呼ばれる仕組みが理解できません。 また、paintの引数のGraphicsクラスは String.voluOf();のStringクラスの様にインスタンス化せずに使っているクラスですか? さらに、setColoor();もstaticメソッドではないのになぜ使えるのでしょうか? 以上三点、 どういう振る舞いをしているのでしょうか?

    • ベストアンサー
    • Java
  • drawStringの座標について

    paintメソッド内で、drawStringで文字列を、 drawImageで画像をそれぞれ表示しています。 drawStringとdrawImageの両方で、同じ座標を 指定しても表示位置がずれます。x座標は ぴったり一致するのですがy座標が7から8ポイント ほどずれます。この二つのメソッドによる座標 と表示位置を一致させたいのですが、よい方法は ありませんでしょうか。どうぞよろしくお願い いたします。 public void paint(Graphics g) { g.drawImage(image,20,20,100,20); Font fnt=new Font("HGゴシックM",Font.PLAIN,12); g.setFont(fnt); g.drawString("Hello",20,20);//座標値はおなじで               も表示位置がずれる }

    • ベストアンサー
    • Java
  • JAVAの文法について教えてください。

    JAVAを学習しはじめたばかりの初心者です。 下記のプログラムに関してわからないので教えてください。 下記はtest.gif画像を表示するプログラムなのですが、 イメージを表示するために import java.awt.Graphicsをインポートして、 Image im でオブジェクトを宣言するのはわかるのですが、 通常はこの後に im = new Image() のようにインスタンス化する必要があると思うのですが、 このプログラムにはありません。 なぜ不要なのでしょうか? ********************** import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; public class MyImage extends Applet{ Image im; public void init(){ im = getImage( getDocumentBase(), "test/test.gif" ); } public void paint(Graphics g){ g.drawImage( im ,10,10, this); } }

    • ベストアンサー
    • Java