Производительность Java-платформера

java performance graphics frame-rate

74 просмотра

2 ответа

457 Репутация автора

Недавно я начал работать над 2D-платформером в Java и задаю вопрос, связанный с производительностью.

В моей игре у меня есть мир (пока что относительно небольшой).

Но более половины мира не видны для камеры игроков, однако я все еще рисую весь мир (даже невидимые части).

Вот что я сейчас делаю.

@Override
public void paintComponent(Graphics g){
    g.translate(player.camX(), player.camY());

    for (GameObject gameObject : solidObjects){
        if (gameObject.isTouching(player.getCameraRect()))
            gameObject.paint(g);
    }

    player.paint(g);

    for (GameObject gameObject : unSolidObjects){
        if (gameObject.isTouching(player.getCameraRect()))
            gameObject.paint(g);
    }

}

Итак, вопрос в том, будет ли быстрее иметь оператор if, проверяющий его на экране перед рисованием?

Автор: Jonty Morris Источник Размещён: 19.07.2016 02:36

Ответы (2)


1 плюс

382 Репутация автора

Решение

Да.

Чтобы проверить, находится ли он на экране, нужно выполнить не более 1 или 2 шагов.

Для рисования всего необходимо нарисовать каждый пиксель на экране независимо от того, используется он или нет.

Автор: Yidna Размещён: 19.07.2016 02:41

1 плюс

11387 Репутация автора

Если gameObject.paint(g);требуется много вызовов для рисования, то, скорее всего, ветвление (проверка) сэкономит больше работы, чем стоит. Если для рисования спрайта это всего лишь один вызов рисования, ваша библиотека уже выполнит такую ​​проверку, чтобы избежать переполнения буфера, а ваша будет избыточной.

Тем не менее, если вы начинаете сталкиваться с проблемами производительности, то я рекомендую использовать какую-то структуру данных. Простой - это сетка, например:

введите описание изображения здесь

Когда ваши элементы перемещаются, удалите их из ячеек сетки, которые они занимают, и вставьте их в новые, которые они занимают. Это должно включать манипулирование несколькими целыми числами, если вы реализуете это эффективно.

Затем, когда вы хотите нарисовать элементы на экране, нарисуйте только те элементы в ячейках сетки, которые перекрываются. Это предотвратит вас зацикливание на каждом элементе игрового мира. Это также пригодится для ускоренного обнаружения столкновений, если вам это нужно.

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

Автор: Dragon Energy Размещён: 09.01.2018 08:14
Вопросы из категории :
32x32