运行此代码时系统冻结

时间:2014-02-16 00:44:43

标签: java linux graphics

我正在youtube上关注Java游戏编程系列,并且在我们向程序添加一些代码之前一直都很顺利。该计划的代码是:

package com.fagyapong.rain;

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

public class Game extends Canvas implements Runnable{
    private static final long serialVersionUID = -247215114548172830L;

    public static int width = 300;
    public static int height = width / 16 * 9;
    public static int scale = 3;

    private JFrame frame;
    public Thread thread;
    private boolean running = false;

    public Game() {

        // Setup Game window
        Dimension size = new Dimension(width * scale, height * scale);
        setPreferredSize(size);

        frame = new JFrame();
    }

    public synchronized void start() {
        running = true;
        thread = new Thread(this, "Display");
        thread.start();
    }

    public synchronized void stop() {

        running = false;
        try {
            thread.join();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void run() {

        while (running) {
            update();
            render();
        }
    }

    public void update() {

    }

    public void render() {

        // Get the canvas' BufferStragy object
        BufferStrategy bs = getBufferStrategy();

        if (bs == null) {
            createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();

        g.setColor(Color.GRAY);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {

        Game game = new Game();
        game.frame.setResizable(false);
        game.frame.setTitle("Rain");
        game.frame.add(game);
        game.frame.pack();
        game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        game.frame.setLocationRelativeTo(null);
        game.frame.setVisible(true);

        game.start();
    }
}

以下是导致系统冻结的代码(已在上面的代码中注释掉)

Graphics g = bs.getDrawGraphics();

g.setColor(Color.GRAY);
g.fillRect(0, 0, getWidth(), getHeight());
g.dispose();
bs.show();

1 个答案:

答案 0 :(得分:0)

好的,我想出了一点问题。我遇到了同样的问题。对我来说问题是三重缓冲。而是将代码设置为:

createBufferStrategy(2);

这样它只是双重缓冲。我没有一台出色的电脑,所以我不得不把它设置为1而不是2.此时,我的猜测是它根本没有缓冲。这就是我让它工作的方式。