Вместо того, чтобы рисовать все эти линии на экране каждый тик, создайте Поверхность с шумом один раз и используйте ее снова.
Еще несколько примечаний:
Текстрендеринг дорогой.Если вы используете много рендеринга текста, лучше кэшируйте поверхности, созданные Font.render
.Обратите внимание, что в Pygame есть также новый модуль freetype
, который лучше, чем модуль font
во всех отношениях.
Ваша проверка на наличие прямоугольника внутри экрана очень странная.Вы можете просто использовать что-то вроде if 0 < b.x < display_width ...
или даже использовать класс Rect
в Pygame, который предлагает хорошие методы, такие как contains()
.
Хороший и быстрый способ создания поверхности из произвольных данных - это использовать numpy
и модуль surfarray
Pygame.Не пугайтесь, это не так сложно использовать.
Вот пример, основанный на вашем коде:
import pygame
import numpy as np
black = (0,0,0)
pygame.init()
display_width = 1000
display_height = 1000
gameDisplay = pygame.display.set_mode((display_width, display_height))
gameDisplay.fill(black)
clock = pygame.time.Clock()
from opensimplex import OpenSimplex
tmp = OpenSimplex()
dimensions = [100,100]
size = 16
def mapping(x):
y = (x + 1) * 10 + 40
return y
# create an 2d array from the noise
def get_array():
rgbarray = np.zeros((dimensions[0], dimensions[1]))
for x in range(dimensions[0]):
for y in range(dimensions[1]):
c = int(mapping(tmp.noise2d(x*0.11, y*0.11)))
# simple way to convert the color value to all three (r,g,b) channels
rgbarray[x, y] = c | c << 8 | c << 16
return rgbarray
# create the array and copy it into a Surface
data = get_array()
surface = pygame.Surface((dimensions[0], dimensions[1]))
pygame.surfarray.blit_array(surface, data)
# scale the Surface to the desired size
scaled = pygame.transform.scale(surface, (dimensions[0]*size, dimensions[1]*size))
# simple way to cache font rendering
font = pygame.font.Font("freesansbold.ttf", 20)
cache = {}
def render(text):
if not text in cache:
cache[text] = font.render(text, 1, (0, 0, 0))
return cache[text]
x = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
x-=1
if x < -1000:
x = 0
gameDisplay.blit(scaled, (x, 0))
fps = render('FPS: ' + str(int(clock.get_fps())))
gameDisplay.blit(fps, (20, 20))
pygame.display.update()
clock.tick(120)