как ускорить код на питоне с библиотекой pygame
мне надо ускорить код ниже до максимума, я ещё плохо знаю питон.
import numpy as np
import pygame
import random
import time
import threading
nach = 50000
h = 700
w = 800
speed = 2000
b = []
x = 0
fpstext = "0"
x = 0
y = 0
for x in range(nach):
b.append([(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(100,w),random.randint(0,h),5])
xb = 0
yb = 0
def keyses():
global xb
global yb
while True:
pressed = pygame.key.get_pressed()
if pressed[pygame.K_s]: yb += 1/speed
if pressed[pygame.K_w]: yb -= 1/speed
if pressed[pygame.K_a]: xb -= 1/speed
if pressed[pygame.K_d]: xb += 1/speed
def otr():
global x
global fpsr
global screen
global fpstext
done = False
tre1 = threading.Thread(target=keyses,daemon=True).start()
tre2 = threading.Thread(target=oc,daemon=True).start()
while not done:
time1 = time.time()
screen.fill((0,0,0))
try:
screen.blit((fpstext),(0,0))
except:
pass
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
for x in range(len(b)):
pygame.draw.rect( screen, b[x][0] , pygame.Rect(b[x][1], b[x][2], 5, 5))
pygame.draw.rect( screen, (random.randint(0,255),random.randint(0,255),random.randint(0,255)) , pygame.Rect(xb, yb, 5, 5) )
pygame.display.flip()
time2 = time.time()
try:
fpsr = str(int(1/(time2-time1)))
screen.blit((fpstext),(0,0))
except:
pass
def oc():
global fpsr
global fpstext
global fps
fpsr = "0"
fps = pygame.font.SysFont("fps",30)
while True:
fpstext = fps.render(fpsr,False,(255,0,50))
time.sleep(0.15)
pygame.init()
screen = pygame.display.set_mode((w, h))
otr()
помогите пожалуйста, мой код даже показывает фпс, но при увеличении количества объектов (за кол-во объектов отвечает nach) падает и фпс,но скорость должна помочь
Ответы (1 шт):
Автор решения: Amgarak
→ Ссылка
Я не мастер оптимизации, но может вас что-то вдохновит из этого фикса.
import pygame
import random
import threading
class Game:
def __init__(self):
self.NACH = 50000
self.H = 700
self.W = 800
self.SPEED = 2000
pygame.init()
self.screen = pygame.display.set_mode((self.W, self.H))
self.blocks = self.generate_blocks()
self.xb, self.yb = 0, 0
self.running = True
def generate_blocks(self):
return [((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
random.randint(100, self.W), random.randint(0, self.H), 5) for _ in range(self.NACH)]
def keyses(self):
while self.running:
pressed = pygame.key.get_pressed()
self.yb += (pressed[pygame.K_s] - pressed[pygame.K_w]) / self.SPEED
self.xb += (pressed[pygame.K_d] - pressed[pygame.K_a]) / self.SPEED
pygame.time.wait(10)
def otr(self):
clock = pygame.time.Clock()
font = pygame.font.SysFont("fps", 30)
fpsr = "0"
while self.running:
time1 = pygame.time.get_ticks()
self.screen.fill((0, 0, 0))
self.screen.blit(font.render(fpsr, False, (255, 0, 50)), (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
for block in self.blocks:
pygame.draw.rect(self.screen, block[0], pygame.Rect(block[1], block[2], 5, 5))
pygame.draw.rect(self.screen, (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
pygame.Rect(self.xb, self.yb, 5, 5))
pygame.display.flip()
clock.tick(60)
time2 = pygame.time.get_ticks()
fpsr = str(int(1000 / (time2 - time1)))
def start(self):
threading.Thread(target=self.keyses, daemon=True).start()
self.otr()
pygame.quit()
if __name__ == "__main__":
game = Game()
game.start()