Как быстро отрисовать поле из множества пикселей в 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)
Надеюсь все правильно описал, сложно объяснить проблему будучи новичком, заранее простите.