难以理解数据是如何传递的

2024-09-22 16:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图在我正在构建的游戏中产生一个类似频闪的效果,而我现在的方式,它破坏了我的帧速率,因为睡眠函数也适用于绘图函数。有人能解释为什么会这样吗?我无法理解的逻辑。为什么我不能每.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()

Tags: 函数import游戏returntimedefsleephue
1条回答
网友
1楼 · 发布于 2024-09-22 16:40:57

sleep函数阻塞主线程。这意味着rand_intgrand_intr从睡眠中“唤醒”之前不会运行。 类似地,rand_intb必须等待rand_intghue必须等待前面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值或“test”。你知道吗

您可以使用计时器回调定期调用hue函数,然后根据某种模式修改rgb值。看到这个问题了吗 executing periodic actions有关如何使用基本的基于时间的机制定期执行函数的示例。你知道吗

编辑

基于你对@jasonharper的评论

如果每60秒调用一次hue,那么对生成随机rgb值的函数的调用以更快的速度发生是没有意义的,因为在hue中不会看到中间时间的任何更改。你知道吗

你能做的就是每60秒调用hue,然后生成你的rgb值,让它有任何模式。你知道吗

我在上面链接的帖子中用@kev修改了答案

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一次,可能是在代码的某个启动部分,并删除函数中对sleep的所有调用。你知道吗

相关问题 更多 >