Я пытаюсь визуализировать вывод численной модели гидродинамики с использованием 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()