互換性を最大限に高めるために、Java2D を使用して単純なゲームを作成しようとしています。Mac OS X Yosemite の Java 8 では問題なく動作しますが、Windows 7 で同じコードを試してみると、それほど滑らかではありません。
私のアプリケーションは BufferStrategy で AWT Canvas を使用し、このように動作します。環境内で何かが移動すると、別のスレッドが repaint を呼び出します。しかし、ウィンドウのサイズ変更処理については、私の戦略は次のとおりです。
public class TestCanvas
{
private static final Color[] colors = new Color[]{Color.black, Color.darkGray, Color.gray, Color.lightGray, Color.blue.darker().darker(), Color.blue, Color.blue.brighter().brighter(), Color.white};
public static void main(String[] args)
{
JFrame frame = new JFrame("Test Canvas");
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
Canvas canvas = new Canvas()
{
@Override
public void paint(Graphics g)
{
BufferStrategy bufferStrategy = getBufferStrategy();
g = bufferStrategy.getDrawGraphics();
paint100Circles(g);
g.dispose();
bufferStrategy.show();
}
@Override
public void update(Graphics g)
{
paint(g);
}
@Override
public void repaint()
{
paint(null);
}
};
contentPane.add(canvas, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(1000, 1000);
frame.setVisible(true);
canvas.createBufferStrategy(2);
}
public static void paint100Circles(Graphics g)
{
Random random = new Random(0);
for (int i = 0; i < 100; i++)
{
int x = Math.abs(random.nextInt()) % 1000;
int y = Math.abs(random.nextInt()) % 1000 + (Math.abs(random.nextInt() % 1000) / 25);
int size = 50 + Math.abs(random.nextInt()) % 50;
g.setColor(colors[Math.abs(random.nextInt()) % colors.length]);
g.fillOval(x, y, size, size);
}
}
}
たぶん、BufferStrategy を正しい方法で使用していないのでしょうか?