Как сделать рисование отдельных пикселей эффективным в Pygame? - PullRequest
2 голосов
/ 30 марта 2020

Я создаю дрянную марку краски в пигме.

Одна проблема, с которой я столкнулся, заключается в том, что она крайне неэффективна.

Имея только изображение 500 на 500, оно работает со скоростью около 14 кадров в секунду.

Изображение сохраняется в виде списка со следующим:

pic = [[white,white,white],[white,white,white],[white,white,white]]

и кодом, который отображает это:

def display(pic):
    for y in range(500):
        for x in range(500):
            screen.set_at((x,y),pic[y][x]) 

как бы я сделал эту работу и быть эффективным.

1 Ответ

3 голосов
/ 30 марта 2020

Я удивлен, что вам удалось получить 14 FPS.

Я уверен, что было бы эффективнее создать PyGame Surface, а затем использовать графические c -примитивные функции для изменения поверхность. Существует целый ряд функций линий и форм - см. документы Pygame . (Примечание: на момент написания https://pygame.org не работал в течение нескольких дней, поэтому ссылка ведет на его архивный кеш inte rnet).

import pygame

# Window size
WINDOW_WIDTH    = 500
WINDOW_HEIGHT   = 500
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

DARK_BLUE = (   3,   5,  54 )
WHITE     = ( 255, 255, 255 )

### initialisation
pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Bad Mouse Paint")

# Drawing on
canvas = pygame.Surface( ( WINDOW_WIDTH, WINDOW_HEIGHT ) )
canvas.fill( DARK_BLUE )

### Main Loop
mouse_down = False
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEBUTTONDOWN ):
            mouse_down = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            mouse_down = False

    # Mouse Movement
    if ( mouse_down ):
        mouse_pos = pygame.mouse.get_pos()
        pygame.draw.circle( canvas, WHITE, mouse_pos, 5, 0 )

    # Update the window, but not more than 60fps
    window.blit( canvas, ( 0, 0 ) )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)


pygame.quit()

В приведенном выше примере поверхность canvas используется для накопления операций рисования. Он записывается на экран за одну blit() операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...