0

互換性を最大限に高めるために、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 を正しい方法で使用していないのでしょうか?

4

1 に答える 1

1

私は createBufferStrategy(3) を使用していますが、2 でも問題ありません。

この回答では、基本的に、paint() ではなく、paintComponent を使用することをお勧めします。引用する:

「ここでの問題は、ペイントが多くの重要な仕事を行うことであり、paintComponent の呼び出しはその 1 つにすぎません。」

paintComponent に切り替えてみてください。あなたがしている他のすべては、ほとんど問題ないように見えます。

ただし、私自身のコードでは、paint() または paintComponent() をまったく呼び出していません。代わりに、できる限り bufferStrategy に書き込みます (render() ループは可能な限り何度も実行されます)。

bufferStrategy を使用すると、ペイント()の外側のバッファに書き込み、ペイント中にバッファを画面に書き込むだけだと思います。この回答で言うように、ポイントは得られませんでしたが、有効なヒントがまだある可能性があります。

したがって、paintComponent を使用してそこでペイントを行うか (ダブル バッファリング戦略を設定することもできますが、グラフィックスに描画することもできます)、または paintComponent/paint の外側のバッファに書き込み、コンポーネントが必要なときにバッファを描画できるようにします。 .

于 2014-11-25T21:26:18.550 に答える