python 多处理和线程太慢

w6lpcovy  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(104)

我在写一个剧本来播放新的堡垒之夜节日模式(只是为了好玩,不想打败我的朋友以外的任何人)虽然代码大多数工作,但偶尔仍会漏掉音符。我相信这是因为代码运行速度太慢,游戏速度太慢。我在吉他英雄中看到过类似的东西,所以我认为Python会足够快,但它似乎不是。我两种都试过了线程和多处理,以及只是普通代码,但他们都显得很慢。我使用vscode,如果这有帮助。

import pyautogui
import multiprocessing

run = True

def a():
    while run:
       if pyautogui.pixel(1010, 1150) [0] == 255:
            pyautogui.keyDown("d")
            pyautogui.keyUp("d")

def b():
    while run:
        if pyautogui.pixel(1200, 1150) [0] == 255:
            pyautogui.keyDown("f")
            pyautogui.keyUp("f")

def c():
    while run:
        if pyautogui.pixel(1400, 1150) [0] == 255:
            pyautogui.keyDown("j")
            pyautogui.keyUp("j")

def d():
    while run:
        if pyautogui.pixel(1560, 1150) [0] == 255:
            pyautogui.keyDown("k")
            pyautogui.keyUp("k")

个字符
我已经尝试了各种各样的东西,包括cython(我只是不能让它太工作)。我的代码可能有缺陷,我意识到有一些时间问题,以达到完美的音符,但它仍然缺少相当多的音符。它似乎只是在代码的不同部分,当一个音符经过时。请让我知道任何修复。

x0fgdtte

x0fgdtte1#

Python很慢,但也没那么慢。游戏是为人类的React时间而设计的,大约300毫秒。即使是最慢的编程语言,在这段时间内也可以执行数百万行。
慢的地方最有可能是在你正在使用的库中:
在调用每个PyAutoGUI函数之后,都有十分之一秒的延迟,以便给予用户时间将鼠标击到角落以触发故障保护。
您可以通过设置pyautogui.FAILSAFE = False来禁用此故障保护。
从cython代码调用这个库不会使它运行得更快。
即使没有这种延迟,从“外部”阅读整个屏幕也可能很慢,因为涉及到很多组件。(操作系统、CPU、GPU都有自己的缓冲区,可能需要复制东西,而且屏幕截图中的像素也很多。)
将所有这些工作重复四次(从不同的线程或进程)也不会让它更快。你可以尝试这样做,以确保库只做一个截图:

im = pyautogui.screenshot()
pix1 = im.getpixel(...)
pix2 = im.getpixel(...)
pix3 = im.getpixel(...)
pix4 = im.getpixel(...)

字符串
也许你可以多读一点文档,看看他们是否对性能有任何其他的描述。你可以也应该把截图限制在你感兴趣的一小部分,这可能(也可能不会)让它更快。
另外,你还应该测量一下实际上有多慢,第一个粗略的方法是在截图前后打印time.time()

相关问题