OpenGL 2D агенты анимация и обновление сценария

Я пытаюсь сделать небольшую игру в 2D, чтобы научиться делать это и улучшить свои навыки программирования. Я программирую игру, используя C ++ / C и OpenGL 3.0 с GLUT.
Я так запутался с некоторыми важными понятиями об анимации и обновлении сценария.

  1. Это хорошая практика загружать все текстуры только тогда, когда уровень начинается?
  2. Я выбираю частоту кадров до 40 кадров в секунду, должен ли я перерисовывать весь сценарий и агентов в каждом кадре или только модификации?
  3. В анимации агента я должен перерисовать весь агент или только части, которые отличаются от прошлого?
  4. Если какая-то часть сцены изменяется (одна стена или что-то подобное разрушается), мне нужно перерисовать всю сцену или только ту часть, которая меняется?

Теперь моя «игра» работает с частотой кадров 40 кадров в секунду, но в игре есть мерцающий эффект, который выглядит действительно странно.

0

Решение

  1. Да, создание и удаление текстур / буферов в каждом кадре — огромная трата.

  2. Почти всегда дешевле перерисовать всю сцену. Графические процессоры созданы для этого, это очень быстро.

    Чтение кадрового буфера из VRAM обратно в обычное ОЗУ и вычисление разницы будет намного медленнее, тем более что OpenGL не отслеживает ваши «объекты», он просто берет треугольник за раз, растеризует его, затем забывает об этом ,

  3. Зависит от того, как вы определяете анимацию. Если вы говорите о спрайт-подобной анимации, где каждый кадр представляет собой отдельное изображение, то дешевле всего просто обратиться к новой текстуре и перерисовать.

    Если у вас есть текстурный атлас, обновите текстурные координаты и перерисовайте, и если вы используете шейдеры (вам это нужно, если вы хотите быть OpenGL 3.0), вы можете обойтись без униформы, которая смещает координаты текстуры.

  4. Да, как я уже говорил, аппаратное обеспечение создано для очистки экрана и перерисовки всего.

И для частоты кадров, вы должны использовать частоту обновления монитора, чтобы избежать вертикального разрыва. Практически все мониторы сейчас имеют частоту 60 Гц, поэтому 60 кадров в секунду — самая распространенная «целевая» частота кадров.

3

Другие решения

Выберите 30 или 60 кадров в секунду, поскольку большинство современных мониторов обновляются с частотой 60 Гц. Таким образом, у вас есть 2 или 1 визуализированный кадр на «кадр монитора». Это должно уменьшить мерцающие эффекты. (Я не уверен на 100%, если вы имеете в виду это «эффект вспышки».)

Относительно всех других вопросов (которые звучат почти одинаково): при рендеринге OpenGL перерисовка происходит довольно часто, так как в большинстве игр почти весь экран меняется в каждом кадре, например, если вы перемещаетесь. Вы мог сделать частичное обновление экрана, но это очень редко и дороже на стороне процессора, так как вы должны вычислить, какие части рисовать, а не просто «рисовать все».

1

  1. да

2-4. Да, надеюсь, это поможет вам понять, почему вы должны …

Представьте, что у вас есть 2 листа бумаги. Первым документом вы рисуете палку стоящего человека и показываете это кому-нибудь.

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

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

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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector