Как быстро отрисовать поле из множества пикселей в Python (Pygame)

В качестве тренировки пишу небольшую пиксельную песочницу, поле которой состоит из прямоугольника размером 900x600 пикселей. Имеется двумерный лист particles в нем записаны координаты частицы и значения частицы в виде кортежа ((цветRGB), температура, проявляемая физика, плотность) particles[x_координата][y_координата] = значения_пикселя. Каждый цикл игры я отрисовываю каждый пиксель используя for с еще одним вложенным в него for

for i in range(w):
    for j in range(h):
        pygame.draw.rect(sc, (particles[i][j][0]), (i, j, 1, 1))

Но это очень долго, хотелось бы знать, можно ли как-нибудь оптимизировать эту часть? Весь код:

Main.py:

import pygame
import PI
import math
pygame.init()
clock = pygame.time.Clock()
fps = 60
playing = True
global w
global h
global drawradx
global drawrady
w, h = (900, 600)
drawupdate = pygame.Rect(w, h, 0, 0)
drawradx = 30
drawrady = drawradx
global mx
global my
mx, my = (0, 0)
drawing1, drawing2 = (False, False)
choosed1, choosed2 = ("sand", "empty")
sc = pygame.display.set_mode((w, h))
sc.set_alpha(None)
global particles
particles = [0] * w         #particles [x][y] = (PI)
for i in range(w):
    particles[i] = [0] * h
def voidfill():
    wt = 0
    ht = 0
    while wt < w:
        while ht < h:
            particles[wt][ht] = PI.empty
            ht += 1
        wt += 1
        ht = 0
voidfill()

def draw(button):
    if button == 1:
        a = PI.__dict__[choosed1]
    if button == 2:
        a = PI.__dict__[choosed2]
    for i in range(drawradx):
        for j in range(drawrady):
            if particles[i][j][2] == "none" or a[2] == "none":
                particles[mx - math.floor(drawradx/2) + i][my - math.floor(drawrady/2) + j] = a

while playing:
    sc.fill((100, 100, 100))

    for ev in pygame.event.get():
        if ev.type == pygame.QUIT:
            playing = False
        if ev.type == pygame.MOUSEMOTION:
            mx, my = ev.pos
        if ev.type == pygame.MOUSEBUTTONDOWN:
            if ev.button == 1:
                drawing1 = True
            if ev.button == 3:
                drawing2 = True
        if ev.type == pygame.MOUSEBUTTONUP:
            if ev.button == 1:
                drawing1 = False
            if ev.button == 3:
                drawing2 = False
    if drawing1 == True:
        draw(1)
    if drawing2 == True:
        draw(2)

    for i in range(w):
        for j in range(h):
            pygame.draw.rect(sc, (particles[i][j][0]), (i, j, 1, 1))
    clock.tick(fps)
    pygame.display.flip()

PI.py:

#Particle info ((R, G, B), Temperature, Physics, density)
empty = ((0, 0, 0), 0, "none", 0)
sand = ((254, 164, 96), 20, "powder", 1300)

Надеюсь все правильно описал, сложно объяснить проблему будучи новичком, заранее простите.


Ответы (0 шт):