Запаздывание фона при прокрутке Pygame

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

часть моего кода: http://pastebin.com/1EzDV7mc

что я делаю неэффективно? как я могу заставить его работать быстрее?


person user1149589    schedule 05.02.2012    source источник


Ответы (2)


См. Руководство для новичков по PyGame

Особенно:

  1. Используйте surface.convert ()

  2. В идеале используйте грязную прямоугольную анимацию, обновляя только те части экрана, которые изменились, а не весь вид. Тем не менее, я ранее использовал обновления всего экрана с PyGame (это то, что вам нужно сделать для игры, в которой весь экран постоянно прокручивается), и это не так уж плохо на современном компьютере, если у вас не слишком много объекты.

Не упоминается в этом руководстве:

  1. вы нацеливаетесь на 60 кадров в секунду с помощью clock.tick (60), цельтесь ниже, 30 кадров в секунду нормально и не сильно нагружаете процессор

  2. Если вам нужно выполнять полноэкранные обновления для прокрутки, то либо а) не используйте много объектов, либо б) прекратите использование PyGame и переключитесь на OpenGL.

  3. почему вы копируете изображения, используя их средние точки, а не их верхнюю левую точку? Ошибка?

  4. Обычно атрибуты размера хранятся как отдельные атрибуты ширины и высоты, а не как список, который необходимо индексировать. Это делает ваш код более понятным.

person junichiro    schedule 05.02.2012
comment
А также: screen.fill ((0, 0, 0))? Почему, потому что ты весь мир слепил. Так что заполнение экрана кажется тяжелой операцией, потому что ничего не делать. Или я что-то упускаю в коде. - person A.H; 06.02.2012
comment
если весь экран прокручивается, а фон в основном пустой (например, при тестировании или, скажем, космический корабль, движущийся через черное пространство), вам может потребоваться заполнять весь экран каждый кадр - person junichiro; 06.02.2012
comment
Хорошо, предположим, что какая-то часть экрана пуста, но код здесь не показывает объекты / много части фона, а только одно изображение. Итак, если он не скрывает весь экран (что в большинстве случаев маловероятно), он знает, чем заполнить (а не весь экран). И, как вы ранее сказали: обновление только тех частей экрана, которые изменились. Когда вы (заполняете (0,0,0)), возникает проблема зачатия. ИМО. - person A.H; 06.02.2012

В дополнение к тому, что сказал Дзюнъитиро, я нашел веб-сайт, дающий информацию, которую он сказал, плюс еще кое-что.

https://www.pygame.org/docs/tut/newbieguide.html

Я не называю вас новичком, даже я многому научился на этом веб-сайте, и я использую pygame уже 6 лет.

Кроме того, surface.convert () работает только с непрозрачными изображениями. Используйте surface.convert_alpha (), который работает со всем. Обычно я создаю функцию, поэтому мне не нужно набирать ее целиком каждый раз, когда я хочу загрузить изображение. Не стесняйтесь использовать следующие 2 строки кода:

def loadify(imgname):
    return pygame.image.load(imgname).convert_alpha()

Это увеличило частоту кадров моей игры с 18 до 30 кадров в секунду.

Удачи!

person Douglas - 15 year old Pythoner    schedule 05.01.2016