2016-07-27 3 views
2

У меня есть сценарий, который находится за пределами игры, читает пиксели и реагирует на эту информацию нажатием клавиш, «нажатием» и т. Д. Итак, чтобы получить пиксели, я использую такой кодУтечка памяти 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 

которые слишком медленно, но если я запускаю время цикла, содержащего эти другие методы, они не постепенно выполнять медленнее и медленнее, как быстрый метод с GetPixel делает (утечка памяти.)

Я использую локальные переменные, которые удаляются впоследствии и т. д. Это проблема GetPixel. Я просто не знаю, где вещи его не удалить это, как сказать, Python, чтобы удалить его, если это вообще возможно, и т.д.

+0

Вы пробовали сохранение содержимого устройства, то есть 'win32gui.GetDC (win32gui.GetActiveWindow())', в локальной переменной внутри вашей функции, а затем удалить его после использования? – TypeKazt

+0

del/gc.collcet может удалить объект/собрать мусор, и вы также можете использовать gc.garbage, чтобы узнать, есть ли ссылочный цикл – galaxyan

ответ

0

Вы должны позвонить win32gui.ReleaseDC для каждого вызова 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 
Смежные вопросы