在 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 次迭代。
我是 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 次迭代。