2016-07-27 151 views
2

我有一個腳本,它位於遊戲之外,讀取像素,並通過「按鍵」,「點擊」等對該信息作出反應。因此,要獲取像素,我使用這樣的代碼Python中的GetPixel內存泄漏

def function(): 
    a = win32gui.GetPixel(win32gui.GetDC(win32gui.GetActiveWindow()), x, y) 
    return a 

爲了快速獲得屏幕上的像素值並讓腳本快速反應。

它從一開始就很好,能夠及時執行所需的所有內容,但它逐漸變慢。

我已經嘗試使用其他方法這樣

def function(): 
    box = (x1, y1, x2, y2) 
    im = ImageOps.grayscale(ImageGrab.grab(box)) 
    a = array(im.getcolors()) 
    a = a.sum() 
    return a 

這是過於緩慢確定問題的根源是GetPixel,但如果我運行一個包含這些其他方法while循環,他們不逐步執行像使用GetPixel的快速方法一樣,速度越來越慢(內存泄漏)。

我使用的是之後刪除的局部變量等。它是GetPixel,是問題所在。我只是不知道它的不刪除的東西,怎麼告訴Python來刪除它,如果這甚至有可能等

+0

您是否嘗試過存儲設備的內容,即'win32gui.GetDC(win32gui.GetActiveWindow())',在自己的函數中的局部變量,然後使用後刪除呢? – TypeKazt

+0

del/gc.collcet可以刪除對象/收集垃圾,也可以使用gc.garbage查看是否有引用循環 – galaxyan

回答

0

你應該叫win32gui.ReleaseDCwin32gui.GetDC每個呼叫GetDC作爲解釋:

使用公共DC繪製後,必須調用ReleaseDC函數來釋放DC。

def function(): 
    hwnd = win32gui.GetActiveWindow() 
    hdc = win32gui.GetDC(hwnd) 
    a = win32gui.GetPixel(hdc , x, y) 
    win32gui.ReleaseDC(hwnd,hdc) 
    return a