FPS падает после загрузки изображений в Java - PullRequest
0 голосов
/ 17 декабря 2018

Итак, я недавно задал вопрос о том, как предварительно загрузить изображения в Java ( предварительная загрузка изображений в Java ), и это сработало великолепно!Пока я не пошел играть в игру.Частота кадров резко упала.Я не знаю, что это было, но в основном у меня есть целая карта спрайтов, загруженная в массив.Каждое изображение соответствует повороту на три градуса.Таким образом, 5 градусов станут 3-градусным изображением, 6 - 6, и т. Д. (Я попробовал Math.round, и он фактически заставил изображения 5 и 4-градусного перейти к 6-градусному изображению, и это более желательноОднако, это медленнее)
Я ищу несколько способов оптимизации кода.Вот мои расчеты углов:

private float getAngle(double x, double y) {
    float angle = (float) Math.toDegrees(Math.atan2(y - this.getCenterY(), x - this.getCenterX()));
    if(angle < 0){
        angle += 360;
    }
    return angle;
}

Значения x и y, введенные в метод, являются центральными значениями x и y врага, на который нацелена башня, выполняющая этот расчет.Затем этот код выполняется в методе рисования:

if(airID==Value.towerCannon && (airRow>0 && airRow<5) && angle>=0) {
    if(angle==Canvas.rotatedAirMap.length) angle = 0;
        g.drawImage(Canvas.rotatedAirMap[angle][level-1], x, y, width, height, null); 
    } else {
        g.drawImage(Canvas.airMap[airRow][airID], x, y, width, height, null); 
    }
}

Это позволит нарисовать соответствующее предварительно загруженное изображение, повернутое на заданный угол («Угол» - или идентификатор изображения - вычисляется, когда башняснимает, разделив результат вычисления угла на три, а затем приведя его к целому числу - я мог бы также округлить это значение)
Какие-либо предложения о том, как оптимизировать это, чтобы я не получал такие массивные выпадения кадров?Я предполагаю, что падение кадров происходит из-за слишком маленького размера кучи виртуальной машины, но я увеличил его, и все же ничего существенного не происходит.Любая помощь будет принята с благодарностью.
Спасибо!

@VGR вот что я сделал с вашим ответом:

public void paintComponent(Graphics g) {
    if(isFirst) { //Define stuff when isFirst is true
        define(); //Sets up the image arrays

        GraphicsConfiguration config = getGraphicsConfiguration();
        if(config == null) {
            GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
            config = env.getDefaultScreenDevice().getDefaultConfiguration();
        }

        BufferedImage compatibleImage = config.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency());

        g = compatibleImage.createGraphics();

        isFirst = false;
    }
}

Это работает немного немного быстрее, но мне пришлось сделать некоторые обходные пути.repaint () вызывается в игровом цикле (этот класс реализует runnable). Таким образом, графический компонент, созданный методом repaint (как это работает), является графикой, которую я использую для всей игры.Будет ли это правильный способ сделать это?

1 Ответ

0 голосов
/ 17 декабря 2018

Перевод изображений из собственной цветовой модели в цветовую модель текущего режима видео может замедлить рендеринг.Чтобы избежать этого, вы можете убедиться, что каждое изображение совместимо с экраном, на котором находится ваше окно:

BufferedImage image = ImageIO.read(/* ... */);

GraphicsConfiguration config = getGraphicsConfiguration();
if (config == null) {
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment;
    config = env.getDefaultScreenDevice().getDefaultConfiguration();
}

BufferedImage compatibleImage = config.createCompatibleImage(
    image.getWidth(), image.getHeight(), image.getTransparency());

Graphics2D g = compatibleImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();

image = compatibleImage;

Если изображение имеет ту же цветовую модель, что и текущий режим видео, существуетперевод не требуется при его рисовании.Возможно даже, что рисование такого изображения может быть полностью выполнено графическим процессором.

...