如何修复pygame中的内存泄漏?

1 投票
1 回答
1594 浏览
提问于 2025-04-18 13:09

这段代码是基于Pygame备忘单上的代码(在这里)。

wht_pix = pygame.Color(0xff,0xff,0xff)
blu_pix = pygame.Color(0x00,0x00,0xff)

pixArr = pygame.PixelArray(self.surface)
for y in xrange(0,self.hgt):
    for x in xrange(0,self.wid):
        if self.grid[x][y]==1: 
            pixArr[x][y] = blu_pix
        else:                  
            pixArr[x][y] = wht_pix
del pixArr  # this line doesn't seem to affect anything

pygame.display.update()

我能理解你为什么想要删除pixArr这个数组,因为它其实只是一个临时数组,用来处理表面缓冲区的像素。不过,我在我的程序中运行top命令时发现,内存使用量慢慢在增加。去掉pixArr相关的代码块后,内存问题就解决了,所以这个问题肯定是在这段代码里。特别是去掉del PixArr这一行后,程序的表现完全一样(内存使用量依然在增加),这就意味着即使包含了这一行,也并没有真正释放内存。

我的假设有什么问题呢? 我该如何修复内存泄漏?

1 个回答

1

正如我在评论中提到的,不要在主应用程序循环中不断创建和删除PixelArray对象(在你的例子中没有显示)。有几种方法可以做到这一点,下面展示了一种简单的方法:

wht_pix = pygame.Color(0xff,0xff,0xff)
blu_pix = pygame.Color(0x00,0x00,0xff)
pixArr = None

while True:  # main application loop
    if pixArr is not None:
        pixArr = pygame.PixelArray(self.surface)
    for y in xrange(0,self.hgt):
        for x in xrange(0,self.wid):
            if self.grid[x][y]==1:
                pixArr[x][y] = blu_pix
            else:
                pixArr[x][y] = wht_pix

    for event in pygame.event.get():
        # process all events

    pygame.display.update()

if pixArr is not None:
    del pixArr

撰写回答