как ускорить код на питоне с библиотекой 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()
→ Ссылка