在 While 循环中加速屏幕捕获

Speeding up Screen Captures in While Loops

我是 python 的新手,我正在尝试制作一个机器人来玩 FNF。显然,这意味着我需要一个速度很快的机器人,但我的代码运行得非常慢。我知道这是因为我正在做的过程很繁重,但我不知道如何加快速度。

from pynput.keyboard import Key, Controller
import PIL.ImageGrab
import time

keyPresser = Controller()

while True:

    pic = PIL.ImageGrab.grab((2000, 400, 2001, 401))
    pic2 = pic.convert("RGB") 
    rgbPixelValue = pic2.getpixel((0, 0))
    if rgbPixelValue != (134, 163, 173):
        keyPresser.press(Key.left)
    
    print(rgbPixelValue)

您的问题似乎是您正在调用 .press()。但是,我认为您实际上想要按下并释放该键。这可以通过在调用 .press() 之后直接调用 keyPresser.release(Key.left) 或仅调用 keyPresser.tap(Key.left) 来完成。当前重复的速度可能只是您 OS.

定义的重复限制

编辑:原来 ImageGrab 太慢了(它使用系统命令和文件系统)。您可以将它与某种形式的多线程(如 concurrent.futures)一起使用,但您可能应该使用专为快速捕获而设计的东西。快速 google 搜索出现 mss,这要快得多:

from pynput.keyboard import Key, Controller
from mss import mss
from PIL import Image

keyPresser = Controller()

with mss() as sct:
    for i in range(100):
        pic = sct.grab((200, 400, 201, 401))
        pic2 = Image.frombytes("RGB", pic.size, pic.bgra, "raw", "BGRX")
        rgbPixelValue = pic2.getpixel((0, 0))
        if rgbPixelValue != (134, 163, 173):
            keyPresser.tap(Key.left)
        
        print(rgbPixelValue)

这(似乎)在我的计算机上实现了每秒大约 100 次迭代。