Замена поверхности вместо того, чтобы бить на нее - PullRequest
0 голосов
/ 05 ноября 2018

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

В настоящее время я помещаю фоновое изображение в буфер отображения:

self.display.blit(self.bg, (0, 0))

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

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Не видя ваш код, будет трудно понять, где находится узкое место. Ленивец прав по своим пунктам как способ оптимизации. по моему опыту все изображения должны быть предварительно обработаны вне основного игрового цикла, рисуя их на своих собственных поверхностях. Размытие поверхностей к поверхностям происходит намного быстрее, чем перетаскивание изображений на поверхности.

img_surface = pygame.Surface((img_rect.width, img_rect.height), pygame.SRCALPHA)
img_surface.fill((0, 0, 0, 0))
img_surface.blit(get_image("my_image.png"), img_rect)

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

Python получает значимые результаты из cProfile

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

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

0 голосов
/ 05 ноября 2018

Неважно , что много, как часто вы что-то моргаете на поверхности экрана, так как дисплей обновляется только после того, как вы позвоните pygame.display.update или pygame.display.flip.

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

a) Вместо того, чтобы стирать весь фон в каждом кадре, используйте функцию clear(), чтобы «стереть» спрайты с экрана.

b) Вместо того, чтобы вызывать pygame.display.flip или pygame.display.update без аргумента, вызовите pygame.display.update со списком областей на экране, которые были изменены, который возвращается draw() функция (возможно в сочетании с clear()).

в) Создайте поверхность дисплея с флагами FULLSCREEN, DOUBLEBUF и HWSURFACE.

Но, как я уже сказал: убедитесь, что вы знаете, где находится ваша горлышко бутылки. Некоторые распространенные подводные камни производительности: многократная загрузка изображений с диска, рендеринг шрифтов, использование различных форматов пикселей (например, не вызывая convert / convert_alpha на поверхностях, созданных из изображений) и, как правило, отсутствие кэширования.

(также обратите внимание, что python / pygame, как правило, не лучший выбор при создании графически требовательных игр)

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