pygame FPS замедляется при увеличении размера экрана (но не размера экрана) - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь визуализировать вывод численной модели гидродинамики с использованием Pygame.Состояние модели представляет собой (nx, ny) массив numpy, который я использую surfarray.blit_array на (nx, ny) поверхности, которая затем перетаскивается на экран.Я поместил рабочий пример ниже (нажмите ESC, чтобы остановить его).

Когда screen_size равен (nx, ny), на моем компьютере код работает со скоростью 60FPS.Когда я устанавливаю screen_size в (nx * 5, ny), он падает до 14FPS.

Я думаю, что я делаю правильные вещи, чтобы обновить дисплей, обновляя только ренты, а не весь экран, так почему же он так резко замедляется, когда на экран добавляется дополнительное пустое пространство?Использование display.update кажется не более быстрым, чем использование display.flip.

import pygame
import numpy as np
from matplotlib.cm import viridis
from matplotlib.colors import Normalize

pygame.init()
pygame.font.init()
font = pygame.font.SysFont("Arial", 18)

nx = 256
ny = 257

# CHANGE THIS TO SEE THE SLOWDOWN
screen_size = (nx, ny)

flags = pygame.DOUBLEBUF #|pygame.HWACCEL|pygame.FULLSCREEN
screen = pygame.display.set_mode(screen_size, flags)
screen.set_alpha(None)
clock = pygame.time.Clock()

def show_array(arr, surf=screen, cmap=viridis):
    normed = Normalize()(arr)
    cmapped = cmap(normed, bytes=True)[:,:, :3]
    pygame.surfarray.blit_array(surf, cmapped)

surf = pygame.Surface((nx, ny))
ocean = np.zeros((nx, ny))
x, y = np.indices(ocean.shape)
ocean[:] = np.cos(x/nx*2*np.pi)   # initial condition

for i in range(10000):
    active_rects = []
    clock.tick(100)
    # move the wave left (this is a stand-in for the real physics)
    ocean = np.roll(ocean, 1, axis=0)
    show_array(ocean, surf)
    active_rects.append(screen.blit(surf, (0, 0)))
    fps = font.render('FPS: %1.f'%clock.get_fps(), True, (255, 255, 255))
    active_rects.append(screen.blit(fps, (5, 5)))
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            exit()
        if e.type == pygame.KEYDOWN:
            if e.key == 27: exit()
    pygame.display.update(active_rects)
    #pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...