难以理解如何传递数据

时间:2018-10-22 01:42:50

标签: python

因此,我正在尝试对正在制作的游戏以及目前使用的方式产生类似频闪的效果,这会破坏帧速率,因为睡眠功能也适用于绘图功能。有人可以解释为什么会这样吗?还有我无法理解的逻辑。为什么我不能每隔0.5秒返回一次,而又不影响我的色相功能中的.1睡眠?

这是该代码的功能的粗略演示。

from random import randint
import time
def rand_intr():
    r = randint(1,256)
    time.sleep(.5)
    return r

def rand_intg():
    g = randint(1,256)
    time.sleep(.5)
    return g

def rand_intb():
    b = randint(1,256)
    time.sleep(.5)
    return b

def hue():
    r = rand_intr()
    g = rand_intg()
    b = rand_intb()
    print(r, g, b)
    print('test')
    time.sleep(.01)

while True:
    hue()

1 个答案:

答案 0 :(得分:0)

sleep函数会阻塞主线程。这意味着rand_intgrand_intr从其睡眠中“唤醒”之前不会运行。 同样,rand_intb必须等待rand_intg,而hue必须等待之前的所有3个功能。这意味着hue可以完成任何工作之前必须等待的总时间至少是完成rand_intrrand_intgrand_intb所需的时间。

如果我们稍微修改您的示例并查看输出,我们将了解发生了什么。

from random import randint
import time

def log_entry_exit(f):
    def wrapped():
        print("Entered {}".format(f.__name__))
        result = f()
        print("Leaving {}".format(f.__name__))
        return result
    return wrapped

@log_entry_exit
def rand_intr():
    r = randint(1,256)
    time.sleep(.5)
    return r

@log_entry_exit
def rand_intg():
    g = randint(1,256)
    time.sleep(.5)
    return g

@log_entry_exit
def rand_intb():
    b = randint(1,256)
    time.sleep(.5)
    return b

def hue():
    r = rand_intr()
    g = rand_intg()
    b = rand_intb()
    print(r, g, b)
    print('test')
    time.sleep(.01)

while True:
    hue()

在这里,我刚刚修改了您的功能,以便在我们进入和退出每个功能时打印一条消息。

输出为

Entered rand_intr
Leaving rand_intr
Entered rand_intg
Leaving rand_intg
Entered rand_intb
Leaving rand_intb
172 206 115
test
Entered rand_intr
Leaving rand_intr
Entered rand_intg
Leaving rand_intg
Entered rand_intb
Leaving rand_intb
240 33 135
test
...

在这里,可以清楚地看到每个sleephue的影响。在完成之前的功能之前,您无法打印rgb值或“测试”。

您可以做的是使用计时器回调定期调用hue函数,然后根据某种模式修改rgb值。请参阅以下有关stackoverflow的问题 executing periodic actions提供了有关如何使用基本的基于时间的机制定期执行功能的示例。

编辑

根据您对@jasonharper的评论

如果您每60秒调用一次hue,那么对生成随机rgb值的函数的调用以更快的速度进行则没有意义,因为在{ {1}}。

您可以做的是每60秒调用hue,然后生成您的rgb值以在其中具有任何模式。

在我上面链接的帖子中,通过@kev修改答案,

hue

现在,您应该只在代码的某些启动部分调用import time, threading def update(): # Do whatever you want here. # This function will be called again in 60 seconds. # ... hue() # Whatever other things you want to do # ... threading.Timer(60.0, update).start() def hue(): r = rand_intr() g = rand_intg() b = rand_intb() print(r, g, b) # Don't call sleep. if __name__ == "__main__": update() 一次,并在您的电话中删除对update 的所有调用功能。