2016-08-27 6 views
0

В настоящее время я работаю над игрой для исследования космоса в 2D-виде сверху. У меня довольно много планет, и поскольку диапазон карты намного больше, чем у дисплея, я получаю много спрайтов планеты, лежащих вне области отображения. На данный момент я предполагаю, что Pygame на самом деле не будет размахивать спрайтом, если они не будут отображаться на дисплее (поскольку я понимаю, что блики и рисование на поверхности замедляют работу довольно много), это правда? Или мне нужно добавить условие, чтобы проверить, находится ли спрайт на дисплее перед ярким звонком? Причина, по которой я спрашиваю, заключается в том, что моя работа заключается в том, что каждый раз, когда открывается планета, создаются 2 новые ... это означает, что игра может стать довольно большой и, возможно, очень медленной.Will Pygame blit спрайты с прямоугольником вне дисплея

Спасибо

ответ

1

Нет, это будет не блитирования изображения. Pygame просто проигнорирует его, если вы пытаетесь разжечь что-то вне экрана. Это не должно замедлять вашу программу, если нет огромного количества объектов, так как для pygame потребуется немного времени, чтобы определить, что изображение находится за пределами экрана. Однако это не огромная сделка.

Понял, что у моего ответа не было доказательств (что плохо, mkay ...), поэтому я проверил несколько тестов, чтобы доказать свою точку зрения. Я протестировал 3 условия: blitting на экран, blitting вне экрана, и ничего не делая. Количество секунд, которое они взяли, незначительно, потому что они основаны на производительности моего компьютера (5-летний ноутбук), поэтому ищите факторы между ними; они должны быть одинаковыми для всех.

5000 Blits

  • Внутри: 0.033265519510593734 секунд
  • Снаружи: 0.002402466401003767 секунд
  • Nothing: 0.00023237229449441657 секунд

500000 Blits

  • Внутри: +3,639024520190433 секунд
  • Снаружи: 0.23328839021967726 секунд
  • Nothing: 0.023549600850092247 секунд

50000000 БЛИЦ

  • Внутри: 360.48034191795153 секунд
  • Снаружи: 23.317473949049596 секунд
  • Nothing: 2.3507101910654455 секунд

Как вы можете видеть, блистание снаружи экрана занимает больше времени, чем не blitting, но на это не требуется почти столько же времени, сколько на самом деле blitting на экране. Блиты снаружи экрана едва ли стоят.

Для дальнейшей ссылки, вот тест, который я создал:

setup = """ 
import pygame 
pygame.init() 
screen = pygame.display.set_mode((100, 100)) 
image = pygame.Surface((100, 100)) 
""" 

statement1 = """ 
for i in range(5000): 
    screen.blit(image, (0, 0)) 
""" 

statement2 = """ 
for i in range(5000): 
    screen.blit(image, (200, 200)) 
""" 

statement3 = """ 
for i in range(5000): 
    pass 
""" 

from timeit import timeit 

num_of_times = 10000 
inside = timeit(stmt=statement1, setup=setup, number=num_of_times) 
outside = timeit(stmt=statement2, setup=setup, number=num_of_times) 
nothing = timeit(stmt=statement3, setup=setup, number=num_of_times) 

print("Inside: {} seconds".format(inside/num_of_times)) 
print("Outside: {} seconds".format(outside/num_of_times)) 
print("Nothing: {} seconds".format(nothing/num_of_times)) 
+0

Хорошо то, что я думал, но так как я не знал, что скрывается в функции Blit я не был уверен, что это не делает много расчетов ни за что. – Sorade

+0

@Sorade Я обновил свой ответ, чтобы добавить больше информации и фактических доказательств того, что я прав, поэтому вы не слепо должны верить сумасшедшему парню с доступом в Интернет. –