Pygame 教程(5):监测游戏时间

本章,你将学习如何监测游戏时间。

导航

上一章:图像传输和绘制文本
下一章:努力更新中……

监测时间

在游戏程序中,时常需要随着时间的流逝而做出不同的动作。例如:倒计时、动画、限制帧率……这就需要对游戏时间进行监测。

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函数运行结果:

line 函数运行结果

aaline函数运行结果:

aaline 函数运行结果

运行结果因设备而异。

结语

以上,就是本章的所有内容。下一章,你将学习如何使用 Pygame 精灵。

猜你喜欢

转载自blog.csdn.net/ZhouJinXuan24/article/details/128766602