如何在pygame中修复此内存泄漏?

时间:2014-07-13 18:06:01

标签: python memory-leaks pygame pygame-surface

此代码段基于Pygame备忘单(here)中的代码。

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 个答案:

答案 0 :(得分: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