Большая потеря кадров при отрисовке с помощью Swing

138
20 декабря 2017, 21:44

Идет потеря кадров при отрисовке объектов с помощью Swing, хотел поинтересоваться как можно оптимизировать код или использовать более подходящие функции. Проблема возникает при частом обновлении вьюхи. В Field в paintComponent мы получаем все объекты в игре и рисуем их.

public class Field extends JPanel {
    View view;
    EventListener eventListener;
    public Field(View view) {
        this.view = view;
        addKeyListener(new KeyHandler());
        setFocusable(true);
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(0x31A75A));
        g.fillRect(0, 0, 500, 500);
        GameObjects gameObjects = view.getGameObjects();
        if (gameObjects != null)
            for (GameObject gameObject : gameObjects.getAll()) {
                gameObject.draw(g);
            }
    }
    public void setEventListener(EventListener eventListener) {
        this.eventListener = eventListener;
    }
    public class KeyHandler extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent e) {
            switch (e.getKeyCode()){
                case KeyEvent.VK_LEFT:
                    eventListener.move(Direction.LEFT);
                    return;
                case KeyEvent.VK_RIGHT:
                    eventListener.move(Direction.RIGHT);
                    return;
                case KeyEvent.VK_UP:
                    eventListener.move(Direction.UP);
                    return;
                case KeyEvent.VK_DOWN:
                    eventListener.move(Direction.DOWN);
                    return;
                case KeyEvent.VK_R:
                    eventListener.restart();
                    return;
                case KeyEvent.VK_W:
                    eventListener.slowMove(Direction.UP);
                    return;
                case KeyEvent.VK_S:
                    eventListener.slowMove(Direction.DOWN);
                    return;
                case KeyEvent.VK_A:
                    eventListener.slowMove(Direction.LEFT);
                    return;
                case KeyEvent.VK_D:
                    eventListener.slowMove(Direction.RIGHT);
                    return;
            }
        }
    }

Также в коде помимо класса Поля присутствует поле View, Player, Wall, Box, методы Wall и Box очень сильно похожи. Они все являются объектами которые мы получаем из gameObjects.

public class Player extends CollisionObject implements Movable {
    private Image image = new ImageIcon("myPlayer.png").getImage();
    private View view;
    public void setView(View view) {
        this.view = view;
    }
    private void update() {
        view.update();
    }
    public View getView() {
        return view;
    }
    public Player(int x, int y) {
        super(x, y);
    }
    @Override
    public void draw(Graphics graphics) {
        Graphics2D g2 = (Graphics2D) graphics;
        g2.drawImage(image, x, y,width,height, null);
    }
    @Override
    public void move(int x, int y) {
        this.x = this.x + x;
        this.y = this.y + y;
    }
    public void slowMove(int x, int y) {
        for (int i = 0; i < Model.FIELD_CELL_SIZE; i=i+2) {
            if (x != 0)
                this.x += 2*x/Model.FIELD_CELL_SIZE;
            if (y != 0)
                this.y += 2*y/Model.FIELD_CELL_SIZE;
            try {
                Thread.sleep(16);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            update();
        }
    }
}

Класс - View

public class View extends JFrame {
    private Controller controller;
    private Field field;
    public View(Controller controller) {
        this.controller = controller;
    }
    public void init() {
        field = new Field(this);
        add(field);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(500, 500);
        setLocationRelativeTo(null);
        setTitle("Сокобан");
       setVisible(true);
    }
    public void setEventListener(EventListener eventListener){
        field.setEventListener(eventListener);
    }
    public void update(){
        field.paintComponent(getGraphics());
    }
    public GameObjects getGameObjects(){
        return controller.getGameObjects();
    }
    public void completed(int level){
        update();
        JOptionPane.showMessageDialog(this,"Level completed","Info",JOptionPane.INFORMATION_MESSAGE);
        controller.startNextLevel();
        getGameObjects().getPlayer().setView(this);
    }
}

Обычный интерфейс EventListenet -

public interface EventListener {
    void move(Direction direction);
    void slowMove(Direction direction);
    void restart();
    void startNextLevel();
    void levelCompleted(int level);

}

Ну и куда же без Controller -

public class Controller implements EventListener {
    View view;
    Model model;
    public Controller() {
        view = new View(this);
        model = new Model();
        view.init();
        model.restart();
        getGameObjects().getPlayer().setView(view);
        model.setEventListener(this);
        view.setEventListener(this);
    }
    public static void main(String[] args) {
        Controller controller = new Controller();
    }
    @Override
    public void move(Direction direction) {
        model.move(direction);
        view.update();
    }
    @Override
    public void slowMove(Direction direction) {
        model.slowMove(direction);
        view.update();
    }
    @Override
    public void restart() {
        model.restart();
        view.update();
    }
    @Override
    public void startNextLevel() {
        model.startNextLevel();
        view.update();
    }
    @Override
    public void levelCompleted(int level) {
        view.completed(level);
    }
    public GameObjects getGameObjects(){
        return model.getGameObjects();
    }

}
READ ALSO
Android Jsoup парсинг

Android Jsoup парсинг

Подскажите в чем ошибка? вылетает приложение

151
сеттер геттер java Android Studio

сеттер геттер java Android Studio

Здравствуйте я дошёл до геттеров сеттеров и не могу закрыть доступ к полям классаДело в том, что знакомый сказал, что не верно класс персон...

155
Получения значения по ключу

Получения значения по ключу

В общем стоит довольно таки тривиальная задача, получения значения по ключу из HashMap или TreeMap (до сих пор не знаю для этой задачи лучше использовать...

175
Перебор ключей JSONObject (библиотека org.json)

Перебор ключей JSONObject (библиотека org.json)

На сервер приходит jsonobject , с неизвестными ключами например:{"perviy":"1","2":"vtoroy","223dsds0":"adfad"} как вытянуть все ключи и соответствующие значения?

270