1

我正在构建这个简单的应用程序,我注意到当 curses 运行时,“top”中的 CPU 负载是 100% .. 这似乎很糟糕。谁能解释一下?

def Run(self, stdscr):

    self.screen = stdscr

    curs_set(0)
    self.screen.nodelay(1)
    self.y_max = self.screen.getmaxyx()[0]
    self.x_max = self.screen.getmaxyx()[1] 

    for e in self.Inv:
        self.Create_Win(self.Inv.index(e), e)

    self.test_win = self.screen.derwin(1, self.x_max, 10, 0)
    self.test_win.addstr(self.TargetDict["Target_1"]["Obj"].Name)

    running = True
    while running:
        self.screen.refresh()
        q = self.screen.getch()


        #Press q to exit program
        if q == ord("q"):
            running = False

在此处输入图像描述

在此处输入图像描述

这是程序在运行时的样子。一旦我用“q”终止程序,它就会恢复正常。

4

2 回答 2

3

问题是调用getch没有阻塞,所以程序不断地循环while循环。从getch文档中:

得到一个字符。请注意,返回的整数不必在 ASCII 范围内:功能键、键盘键等返回大于 256 的数字。在无延迟模式下,如果没有输入,则返回 -1,否则 getch() 等待直到一个键被按下。

您的程序nodelay在循环之前设置:

self.screen.nodelay(1)
于 2013-03-28T16:16:13.260 回答
1

在需要 nodelay(True) 的地方,使用内置的睡眠功能

curses.napms(10)

在 while 循环结束时,以限制您的 FPS。数字以毫秒为单位,因此例如 10ms 应该以 100FPS 刷新循环。

在我的练习游戏中,这个解决方案将 CPU 使用率降低到几乎 0%,而对响应速度没有明显影响。

于 2022-02-03T09:40:05.363 回答