2016-07-27 49 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