【问题标题】:GetPixel memory leak in PythonPython中的GetPixel内存泄漏
【发布时间】:2016-07-27 19:35:51
【问题描述】:

我有一个脚本,它位于游戏之外,读取像素,并通过“按键”、“点击”等方式对该信息做出反应。因此,为了获取像素,我使用这样的代码

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

为了快速获取屏幕上的像素值并让脚本快速做出反应。

它开始很好,能够及时执行它需要的一切,但它会逐渐变慢。

通过尝试使用类似这样的其他方法,我已将问题源确定为 GetPixel

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

这太慢了,但是如果我运行包含这些其他方法的 while 循环,它们不会像 GetPixel 的快速方法那样逐渐执行越来越慢(内存泄漏。)

我正在使用之后删除的局部变量等。问题是 GetPixel。我只是不知道它没有删除的东西在哪里,如何告诉 Python 删除它,如果这可能的话,等等。

【问题讨论】:

  • 您是否尝试过将设备内容(即win32gui.GetDC(win32gui.GetActiveWindow()))存储在函数内的局部变量中,然后在使用后将其删除?
  • del/gc.collcet可以删除对象/收集垃圾,也可以使用gc.garbage查看是否有引用循环

标签: python memory pixel getpixel


【解决方案1】:

您应该为每次调用win32gui.GetDC 调用win32gui.ReleaseDC,如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

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 2011-12-13
    • 2014-02-26
    • 2010-11-27
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多