Утечка памяти GetPixel в Python

У меня есть скрипт, который находится вне игры, считывает пиксели и реагирует на эту информацию, «нажимая клавиши», «щелкая» и т. д. Итак, чтобы получить пиксели, я использую такой код

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 удалить его, возможно ли это вообще и т. д.


person gr_y    schedule 27.07.2016    source источник
comment
Вы пытались сохранить содержимое устройства, то есть win32gui.GetDC(win32gui.GetActiveWindow()), в локальной переменной внутри вашей функции, а затем удалить его после использования?   -  person TypeKazt    schedule 27.07.2016
comment
del/gc.collcet может удалить объект/собрать мусор, и вы также можете использовать gc.garbage, чтобы увидеть, есть ли эталонный цикл   -  person galaxyan    schedule 27.07.2016


Ответы (1)


Для каждого вызова win32gui.GetDC, как описано в GetDC:

После рисования с помощью общего контроллера домена необходимо вызвать функцию ReleaseDC, чтобы освободить контроллер домена.

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