如何按指定帧率优化打印ASCII艺术?寻求替代time.sleep()的方案
优化ASCII艺术帧率的解决方案
你遇到的问题确实很常见——time.sleep()只会固定等待设定的时长,完全没考虑读取文件、打印内容这些操作本身消耗的时间,自然会让帧率忽快忽慢。
一、无需额外库的手动修正方案
用time.perf_counter()(高精度计时器)记录每帧的起始时间,计算当前帧实际需要等待的时长,减去已经消耗的时间后再调用sleep,就能保证帧率稳定。修改后的代码如下:
import os import time import winsound def play_ascii(): frame_dir = 'temp/ascii' maxcount = len(os.listdir(frame_dir)) count = 1 # 改成输入帧率更直观,比如输入30代表每秒30帧 target_fps = float(input("Target FPS (recommended value: 30)")) frame_duration = 1 / target_fps # 每帧应该占用的时间 winsound.PlaySound("temp/audio.wav", winsound.SND_ASYNC | winsound.SND_ALIAS) while count < maxcount: frame_start = time.perf_counter() # 读取并打印帧内容 with open(f"{frame_dir}/frame{:05d}.txt".format(count), 'r') as f: print(f.read()) # 计算已消耗时间,调整sleep时长 elapsed = time.perf_counter() - frame_start sleep_time = max(0, frame_duration - elapsed) time.sleep(sleep_time) count += 1 winsound.PlaySound(None, winsound.SND_ASYNC)
二、适合的Python库推荐
如果想更省心,可以用pygame——它自带成熟的帧率控制工具,同时还能更灵活地处理音频播放,适合做这类多媒体同步的ASCII动画。
示例代码大致结构:
import os import pygame def play_ascii(): frame_dir = 'temp/ascii' maxcount = len(os.listdir(frame_dir)) count = 1 target_fps = float(input("Target FPS (recommended value: 30)")) # 初始化pygame pygame.init() clock = pygame.time.Clock() # 加载并播放音频 pygame.mixer.music.load("temp/audio.wav") pygame.mixer.music.play() while count < maxcount: # 读取并打印帧 with open(f"{frame_dir}/frame{:05d}.txt".format(count), 'r') as f: print(f.read()) # 自动控制帧率,处理等待时长 clock.tick(target_fps) count += 1 pygame.mixer.music.stop() pygame.quit()
内容的提问来源于stack exchange,提问作者Vojtěch Šokala
相关产品推荐
相关产品推荐

