本章,你将学习如何监测游戏时间。
导航
上一章:图像传输和绘制文本
下一章:努力更新中……
监测时间
在游戏程序中,时常需要随着时间的流逝而做出不同的动作。例如:倒计时、动画、限制帧率……这就需要对游戏时间进行监测。
Pygame 使用pygame.time
模块监测时间, 以毫秒(
1
1000
\frac{1}{1000}
10001秒)作为计时单位。
该模块中的所有函数如下表所示(详见官方文档):
函数定义 | 函数作用 |
---|---|
get_ticks() -> milliseconds |
获取从调用pygame.init 函数到现在经过了多少毫秒。当没有调用pygame.init 时,该函数始终返回0 。 |
wait(milliseconds) -> time |
暂停程序一定的时间,使程序休眠。该函数对处理器的消耗较少,精度比pygame.time.delay 低。返回实际暂停的毫秒数。 |
delay(milliseconds) -> time |
暂停程序一定的时间。该函数使用处理器来控制时间,精度比pygame.time.wait 高。返回实际暂停的毫秒数。 |
set_timer(event, millis, loops=0) -> None |
每隔一定的毫秒,在事件队列中创建给定的事件,事件可以是pygame.Event 对象,也可以是代表事件的整数。可选参数loops 可用于指定创建的次数,如果使用默认值(0 ),将持续创建事件,直至明确停止。要明确停止计时器,请使用相同的事件参数再次调用该函数,但是将millis 设置为0 。 |
游戏帧速率
游戏的运行速度可以通过 FPS(Frames Per Second,每秒刷新的帧数)表示。pygame.time
模块中就定义了Clock
类,用于帮助跟踪时间以及控制游戏帧速率。
该类的所有方法如下表所示(详见官方文档):
方法定义 | 方法作用 |
---|---|
tick(framerate=0) -> milliseconds |
该方法应该每帧调用一次,它将计算自上一次调用经过了多少毫秒。如果传入了可选的framerate 参数,该方法将延迟以限制游戏的帧率。例如,如果每一帧都调用Clock.tick(60) ,该方法将确保游戏的运行帧率不超过 60 fps。 |
tick_busy_loop(framerate=0) -> milliseconds |
与pygame.time.Clock.tick 方法相似。不同的是该方法将使用pygame.time.delay 函数来延迟时间,因此精度更高,但是,这将导致在繁忙的循环中,对 CPU 进行大量的消耗。 |
get_time() -> milliseconds |
获取最近两次调用pygame.time.Clock.tick 之间的毫秒数。 |
get_raw_time() -> milliseconds |
与pygame.time.Clock.get_time 方法类似,但是该方法不包括在延迟帧速率时使用的任何时间。 |
get_fps() -> float |
计算该Clock 对象的帧率。通过对pygame.time.Clock.tick 方法的最后十次调用取平均值来计算。 |
实例:绘图性能对比
本实例比较简单,将通过调用pygame.time.Clock.get_time
方法比较pygame.draw.line
函数和pygame.draw.aaline
函数的性能。
完整代码如下:
import sys
import pygame
class PerformanceComparsion:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((800, 800))
pygame.display.set_caption('Performance Comparsion')
self.clock = pygame.time.Clock()
self.time_list = []
def run(self):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
print(1000 / (sum(self.time_list) / len(self.time_list)))
pygame.quit()
sys.exit()
self.screen.fill((255, 255, 255))
for i in range(100):
# 运行后记得切换函数
pygame.draw.line(self.screen, (0, 0, 0), (0, i * 5 + 5), (800, i * 5 + 5))
pygame.display.update()
self.clock.tick()
self.time_list.append(self.clock.get_time())
if __name__ == '__main__':
app = PerformanceComparsion()
app.run()
本实例并没有使用get_fps
方法,是因为该方法需要计算前10次调用tick
方法的间隔时间的平均值,计算会出现误差。本实例将直接使用get_time
方法,将每帧的间隔时间添加到time_list
当中。在程序的最后计算平均的间隔时间,再用
1000
间隔时间
\frac{1000}{间隔时间}
间隔时间1000 获取平均 fps。
注意:
1. 请在运行后记得切换函数。
2. 不要长时间运行该程序,否则列表中将堆积大量的数,计算量是巨大的。
line
函数运行结果:
aaline
函数运行结果:
运行结果因设备而异。文章来源:https://www.toymoban.com/news/detail-495409.html
结语
以上,就是本章的所有内容。下一章,你将学习如何使用 Pygame 精灵。文章来源地址https://www.toymoban.com/news/detail-495409.html
到了这里,关于Pygame 教程(5):监测游戏时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!