如何在pygame中高效地绘制单个像素?

2024-04-27 15:50:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pygame做一个蹩脚的油漆品牌

我遇到的一个问题是,它效率极低

只有一张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]) 

我将如何使这项工作有效


Tags: 代码in列表fordefdisplay图片range
1条回答
网友
1楼 · 发布于 2024-04-27 15:50:00

我很惊讶你居然能得到14帧

我相信创建PyGame Surface,然后使用图形原语函数修改曲面会更有效。有一大堆的线函数和形状函数-参见pygame docs。(注意:在撰写本文时,https://pygame.org已经关闭了几天,因此链接会转到它的internet存档缓存)

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()操作中写入屏幕

相关问题 更多 >