teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コメントの追加

2020/03/27 15:06

投稿

rimokonTenko_mo
rimokonTenko_mo

スコア12

title CHANGED
File without changes
body CHANGED
@@ -54,8 +54,8 @@
54
54
  this.setVisible(true);
55
55
 
56
56
  timer = new Timer(1000 / FPS, this);
57
- back = createImage(this.getWidth(), this.getHeight());
57
+ back = createImage(this.getWidth(), this.getHeight());//バッファイメージ
58
- buffer = back.getGraphics();
58
+ buffer = back.getGraphics();//イメージのグラフィクス
59
59
  titleImage = MyUtilities.getImage("../images/title/TitleImage.jpg");
60
60
 
61
61
  timer.start();
@@ -64,6 +64,7 @@
64
64
  @Override
65
65
  public void paint(Graphics graphics){
66
66
  if(buffer != null){
67
+ //イメージの更新、描画
67
68
  buffer.clearRect(0, 0, this.getWidth(), this.getHeight());
68
69
  buffer.drawImage(titleImage, 0, 0, this.getWidth(), this.getHeight(), null);
69
70
  }
@@ -77,7 +78,7 @@
77
78
 
78
79
  if(source == timer){
79
80
  timeMeasure.Update();
80
- repaint();
81
+ repaint();//再描画
81
82
  }
82
83
  }
83
84
 
@@ -87,7 +88,7 @@
87
88
  @Override
88
89
  public void componentMoved(ComponentEvent e) {}
89
90
 
90
- @Override
91
+ @Override//リサイズしたとき
91
92
  public void componentResized(ComponentEvent e) {
92
93
  back = createImage(this.getWidth(), this.getHeight());
93
94
  buffer = back.getGraphics();

2

コードの追加

2020/03/27 15:06

投稿

rimokonTenko_mo
rimokonTenko_mo

スコア12

title CHANGED
File without changes
body CHANGED
@@ -17,5 +17,86 @@
17
17
  ・試しに、**paint(Graphics g)**において、先頭で**buffer = g;**を書くと(ダブルバッファリングしないようにすると)ちらつくが速くなった。
18
18
  ・試しに、インスタンス生成時に**createImage(2000, 2000)**とするとずっと遅くなった。
19
19
 
20
+ #修正(該当のコード)
21
+ ```java
22
+ package orgmarigo.test;
23
+
24
+ import javax.swing.*;
25
+ import java.awt.Graphics;
26
+ import java.awt.Image;
27
+ import java.awt.event.*;
28
+
29
+ import orgmarigo.util.Vector2;
30
+ import orgmarigo.util.TimeMeasure;//フレームレートを測定するクラス
31
+ import orgmarigo.util.MyUtilities;
32
+
33
+ public class ScreenTest extends JFrame implements ActionListener, ComponentListener{
34
+ static public final Vector2 INITIAL_WINDOW_SIZE = new Vector2(630, 560);
35
+ static public TimeMeasure timeMeasure = new TimeMeasure(100);
36
+ static public final int FPS = 100;
37
+
38
+ private Timer timer;
39
+ private Image back;
40
+ private Graphics buffer;
41
+ private Image titleImage;
42
+
43
+ public static void main(String[] args) {
44
+ new ScreenTest();
45
+ }
46
+
47
+ public ScreenTest(){
48
+ this.setTitle("ScreenTest");
49
+ this.setBounds(300, 200, (int)INITIAL_WINDOW_SIZE.getX(), (int)INITIAL_WINDOW_SIZE.getY());
50
+ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
51
+
52
+ this.addComponentListener(this);
53
+
54
+ this.setVisible(true);
55
+
56
+ timer = new Timer(1000 / FPS, this);
57
+ back = createImage(this.getWidth(), this.getHeight());
58
+ buffer = back.getGraphics();
59
+ titleImage = MyUtilities.getImage("../images/title/TitleImage.jpg");
60
+
61
+ timer.start();
62
+ }
63
+
64
+ @Override
65
+ public void paint(Graphics graphics){
66
+ if(buffer != null){
67
+ buffer.clearRect(0, 0, this.getWidth(), this.getHeight());
68
+ buffer.drawImage(titleImage, 0, 0, this.getWidth(), this.getHeight(), null);
69
+ }
70
+
71
+ graphics.drawImage(back, 0, 0, this);
72
+ }
73
+
74
+ @Override
75
+ public void actionPerformed(ActionEvent e){
76
+ Object source = e.getSource();
77
+
78
+ if(source == timer){
79
+ timeMeasure.Update();
80
+ repaint();
81
+ }
82
+ }
83
+
84
+ @Override
85
+ public void componentHidden(ComponentEvent e) {}
86
+
87
+ @Override
88
+ public void componentMoved(ComponentEvent e) {}
89
+
90
+ @Override
91
+ public void componentResized(ComponentEvent e) {
92
+ back = createImage(this.getWidth(), this.getHeight());
93
+ buffer = back.getGraphics();
94
+ }
95
+
96
+ @Override
97
+ public void componentShown(ComponentEvent e) {}
98
+ }
99
+ ```
100
+
20
101
  #その他
21
102
  ・ネットで調べて、setDoubleBuffered(boolean)を見つけたが使い方がわからなかった。

1

追加

2020/03/27 15:03

投稿

rimokonTenko_mo
rimokonTenko_mo

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- ダブルバッファリングしたら重くなりました
1
+ ダブルバッファリングしたら重くなりました
body CHANGED
@@ -9,11 +9,13 @@
9
9
  ・componentResizedをオーバーライドして`Image[back]`と`Graphics[buffer]`を変更(更新)する。
10
10
  ・update(Graphics g)はオーバーライドしていない。
11
11
 
12
+
12
13
  #問題点
13
14
  ・実行してみて、画面を大きくすると動きが遅くなることに気がついた。
14
15
  ・フレームレートを測定すると、画面の大きさに比例して時間が遅くなっていた。
15
16
  ・試しに、**graphics.drawImage(back, 0, 0, this)**だけをコメントアウトすると画面は変わらないが、フレームレートは速くなった。
16
17
  ・試しに、**paint(Graphics g)**において、先頭で**buffer = g;**を書くと(ダブルバッファリングしないようにすると)ちらつくが速くなった。
18
+ ・試しに、インスタンス生成時に**createImage(2000, 2000)**とするとずっと遅くなった。
17
19
 
18
20
  #その他
19
21
  ・ネットで調べて、setDoubleBuffered(boolean)を見つけたが使い方がわからなかった。