【问题标题】:How do I fix this memory leak in pygame?如何在 pygame 中修复此内存泄漏?
【发布时间】:2014-07-13 18:06:00
【问题描述】:

此代码 sn-p 基于 Pygame Cheat Sheet (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 行似乎使程序的行为方式完全相同(内存消耗增加),这在某种程度上暗示它在包含时并没有真正释放内存。

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

【问题讨论】:

  • 重复:stackoverflow.com/questions/7866940/python-memory-leak - 这是(是?)PixelArray 中的错误。所以不幸的是,目前的答案是不要使用PixelArray
  • 这是一个可怕的答案,但我担心它可能是正确的。
  • 该答案的交叉帖子:“我在 Python 3.4.0 上并使用 PyGame 1.9.2a0,运行它不会给我带来泄漏。”
  • 请注意,del pixArr不会释放pixArr。它只会删除该引用(这可能触发解除分配)。在该代码中,它什么也不做。如果deallocation有问题是pygame的C代码中的一个程序,那么你就无能为力了。

标签: python memory-leaks pygame pygame-surface


【解决方案1】:

正如我在评论中提到的,只是不要在主应用程序循环中继续创建和删除PixelArrayobject(未在您的示例中显示)。有几种方法可以做到这一点,一个简单的如下所示:

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

【讨论】:

    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2012-01-12
    相关资源
    最近更新 更多