1

このコード スニペットは、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と、プログラムがまったく同じように動作するように見えます (メモリ消費量が増加します)。これは、IS が含まれている場合、実際にはメモリを解放していないことを意味します。

私の仮定の何が問題になっていますか?メモリリークを修正するにはどうすればよいですか?

4

1 に答える 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
于 2014-07-13T20:56:14.990 に答える