Python Pyame Super Slow с увеличенным размером окна - PullRequest
0 голосов
/ 21 мая 2019

Аппаратное обеспечение: iMac с 4,7 ГГц i7, 40 ГБ оперативной памяти DDR4 и Radeon Pro 580 8192 МБ

-> Любопытно, что мой обновленный код, размещенный ниже, работал на моем iMac * 1003 только на 1,6 FPS*

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

Сначала игровое окно (на котором ничего не отображается) работает со скоростью около 150 кадров в секунду при 100x100 пикселей.К тому времени, когда он увеличивается до 1000x1000 пикселей, он работает со скоростью всего 2 кадра в секунду.

Что я делаю не так?Мне придется отказаться от создания моей игры, если fps будет таким низким.Спасибо за помощь.

import pygame, time
pygame.init()

display_width = 100
display_height = 100
win = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    win.fill((0, 0, 0)) #fills over pre-existing elements

    pygame.display.update()
    clock.tick()
    print(clock.get_fps())
    display_width += 1
    display_height += 1
    win = pygame.display.set_mode((display_width, display_height))

print('QUIT')
pygame.quit()

ОБНОВЛЕНИЕ: я был уведомлен, что обновление измерений дисплея на каждой итерации делает это несправедливым тестом на производительность.Вот почему я обновил код ниже.Этот код инициализирует размер окна в 2000x2000 и постоянно обновляет его как пустой экран.Тем не менее, это все еще только достигает 6 FPS без ничего даже на нем.Почему это?

import pygame, time
pygame.init()

display_width = 2000
display_height = 2000
win = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    win.fill((0, 0, 0)) #fills over pre-existing elements

    pygame.display.update()
    clock.tick()
    print(clock.get_fps())


print('QUIT')
pygame.quit()

1 Ответ

0 голосов
/ 21 мая 2019

pygame.display.set_mode - относительно дорогая операция, и вы, похоже, делаете это на каждой отдельной итерации цикла.

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

def increase_screen():
    display_width += 1
    display_height += 1
    win = pygame.display.set_mode((display_width, display_height))

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

# Somewhere earlier in the code
ticks = 0

# Somewhere later in the update part of the loop
ticks += 1

if ticks == 1000:
    increase_screen()
    ticks = 0

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

...