首页 > 解决方案 > 为循环 PyGame 绘制双倍加速

问题描述

我有一个 pygame 游戏,它目前在绘制到屏幕过程中遇到瓶颈。这是代码(pg是pygame):

def draw_living_cells(self):
    self.screen.fill(BLACK)
    for x in range(0, GRID_WIDTH + 1):
        for y in range(0, GRID_HEIGHT):
            if self.grid[x + 1][y + 1] == 1:
                pos = (int(x * CELL_SIZE), int(y * CELL_SIZE), int(CELL_SIZE), int(CELL_SIZE))
                pg.draw.rect(self.screen, LIFE_COLOR, pos, 0)
    pg.display.flip()

我认为多处理可能会有所帮助,但我不确定如何实现,如果可能(由于可能的共享内存问题)或者它是否有帮助。

在 800x600 显示器中,使用大小为 200x150 的 self.grid 时,此过程大约需要 20 毫秒。我认为在如此简单的过程中拥有约 50fps 的速度很奇怪。

标签: pythonpygamepygame-surface

解决方案


最后,我尝试了类似于 Glenn 建议的方法。我使用 numpy 来获取活细胞的位置,然后遍历这些坐标而不是整个网格。这使性能提高了 2.5~3 倍。新代码:

def draw_living_cells(self):
    self.screen.fill(BLACK)

    living_cells_xy = np.where(self.grid == 1)
    living_cells = len(living_cells_xy[0])
    for i in range(0, living_cells):
        x = living_cells_xy[0][i] - 1
        y = living_cells_xy[1][i] - 1
        pos = (int(x * CELL_SIZE), int(y * CELL_SIZE), int(CELL_SIZE), int(CELL_SIZE))
        pg.draw.rect(self.screen, LIFE_COLOR, pos, 0)
    pg.display.flip()

推荐阅读