在python3中,将文本输出到控制台的最快方法是什么

2024-06-10 22:52:41 发布

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

我正在创建一个应该在命令行上运行的游戏。游戏使用文本作为画布上的一个元素(软件将文本打印成矩形,当文本改变时,图像也会改变)。我创建了一个小纸条来测试它是如何工作的

import os

# function for printing out the game display grid
def printgrid(input):
    for i in range(len(input)):
        for j in range(len(input[0]):
            print(input[i][j], end='')
        print('') # newline after each row

grid = [['#' for x in range(10)] for x in range(10)]
while (True):
    # refresh the screen and reprint
    os.system('clear')
    printgrid(grid)

不幸的是,代码似乎打印网格太慢,导致在打印过程中出现明显的滚动效果,这将使游戏无法玩。你知道吗

  1. 有没有更快的方法用python打印文本?

  2. 造成这种滚动效果的原因可能只是因为我没有对这段代码设置任何帧速率上限,而它只是在计算机监视器刷新时显示当前输出?

  3. 如果我的方法是完全错误的,那么最好的方法是什么?你知道吗

Tags: the方法代码in文本游戏forinput
3条回答

假设您使用的是类Unix操作系统(Linux或Mac),那么最好的方法就是使用curses(https://docs.python.org/3/howto/curses.html)。然而,这可能是一个很大的努力,并可能是过度杀伤力为您所做的。你知道吗

如果你选择走简单的路线,那么你应该推迟重新粉刷。现在你在把所有的东西都放到屏幕上之后马上就会清空,这会给你带来麻烦。相反,你可以这样做:

from time import sleep
while (True):
    # refresh the screen and reprint
    os.system('clear')
    printgrid(grid)

    sleep(0.1)    # sleep 0.1 seconds before clear

这将做什么是离开屏幕上的文字更长的时间,然后重新绘制,这将使它更容易看到。充分利用你的睡眠时间,找出最适合你的应用程序的。你知道吗

由于Python 3.3 print()支持关键字参数“flush”(see documentation):

print('Hello World!', flush=True)

打印到控制台通常很慢,因为大多数语言倾向于等到消息显示后再继续。你现在的方法有很多方法可以解决这个问题。你知道吗

如果您通过sys.stdout使用文件API,您可以根据需要write()多次调用,并在屏幕准备好打印时调用flush()。您还可以尝试尽可能少地调用write(),也许可以在内存中构建字符串并将其整体输出。你知道吗

不过,帧速率上限是绝对必要的。控制台不是一个快速的接口,它不能做高帧速率。实施一个上限,玩数字。你知道吗

简而言之:

  • 尽量少打电话给write()
  • 只有在准备好渲染时才调用flush()
  • 将帧速率设置为10,然后设置为20,然后设置为30。实验

另一种方法是使用ncurses,它肯定会使游戏加速。使用它,您可以只更新需要重新渲染的屏幕部分,而不是重新打印整个屏幕。你知道吗

相关问题 更多 >