Java оптимизирует рисование фонового изображения для игры - PullRequest
1 голос
/ 03 марта 2010

Я работаю над воссозданием «Легенды о Зельде, связывающей прошлое» как часть задания.

И у меня есть следующая проблема, игровой мир представляет собой BufferedImage, в котором я subImage () часть, которая мне нужна для текущего местоположения игрока. Игра работает, но использует 80/110 процентов процессора. Профиль показал, что виновником является рисунок изображения.

Итак, я решил поместить фон в отдельную JPanel от Player, врагов и т.д. JPanel. Визуализируйте их друг над другом (JLayeredPane) и перекрашивайте фоновую панель гораздо реже.

Но как мне это сделать, как заставить свинг рисовать одну панель x раз в секунду, а другую y раз? Если у вас есть лучший способ оптимизации, дайте мне знать.

Вот что у меня есть на данный момент:

public class Main extends JFrame
{
    private ZeldaGame game = new ZeldaGame();
    private View view = new View(game);
    private BackgroundView bckView = new BackgroundView(game);
    private Controller ctl = new Controller(game, view, bckView, this);

    public Main()
    {
        setLayout(null);

        view.setBounds(0, 0, game.getWidth(), game.getHeight());
        bckView.setBounds(0, 0, game.getWidth(), game.getHeight());

        JLayeredPane pane = new JLayeredPane();
        pane.add(bckView, 1);
        pane.add(view, 0);

        setLayeredPane(pane);

        setSize(game.getWidth(), game.getHeight());
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);
    }

    public static void main(String[] args)
    {
        new Main();
    }
}

Спасибо.

Ответы [ 2 ]

4 голосов
/ 03 марта 2010

На самом деле невозможно иметь разное время рендеринга из-за того, как работает кадровый буфер - в результате получится множество неприятных мерцаний. Вам нужно использовать Canvas вместо JPanel и JLayeredPane, и вы можете либо переопределить метод paint() холста, либо использовать bi.getGraphics(), а также пометить фон и символы в цикле, используя любой эти методы в правильном порядке. Я бы посоветовал использовать тонкий движок, такой как GTGE , который будет абстрагироваться от всех грязных деталей оптимизации. Эти высокоуровневые компоненты, которые вы используете серьезно, не предназначены для игр, и вам вообще не следует их использовать.

0 голосов
/ 03 марта 2010

Хорошо, я нашел ошибку в моих путях. Я использовал пассивный рендеринг, в то время как я должен был использовать активный рендеринг . Активный рендеринг в основном отключает автоматическое перерисовывание, вызывая setIgnoreRepaint (true); на кадре и сделай цикл сам.

И в качестве дополнительного бонуса мне не нужно использовать JPanels.

...