一、本文简介
主要记录了如何在pygame中控制帧率,解决游戏运行忽快忽慢的问题
二、问题现象
外星人入侵-没有控制帧率
运行游戏时游戏忽快忽慢
三、原因及解决方案
原因:游戏中没有控制帧率,导致游戏的运行速度受电脑CPU等资源使用的影响。
解决方法:使用pygame中的Clock()方法来控制。3行代码搞定
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboard
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption('Alien Invasion')
// 帧率控制
clock = pygame.time.Clock()
FPS = 60
play_button = Button(ai_settings, screen, "Play")
ship = Ship(ai_settings, screen)
bullets = Group()
aliens = Group()
stats = GameStats(ai_settings)
scoreboard = Scoreboard(ai_settings, screen, stats)
gf.create_fleet(ai_settings, screen, ship, aliens)
while True:
gf.check_events(ai_settings, screen, stats, scoreboard, ship, aliens, bullets, play_button)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings, screen, stats, scoreboard, ship, bullets, aliens)
gf.update_aliens(ai_settings, stats, screen, scoreboard, ship, aliens, bullets)
gf.update_screen(ai_settings, screen, stats, scoreboard, ship, aliens, bullets, play_button)
// 帧率控制
clock.tick(FPS)
run_game()
效果:
外星人入侵-控制帧率
四、clock.tick()实现游戏帧率控制的原理
clock.tick(FPS) 控制游戏帧率的原理基于时间控制。几个关键概念:
- 帧(Frame):在游戏开发中,每一帧是屏幕上显示的一次完整画面更新。游戏的动画效果和逻辑通常是通过不断更新和显示帧来实现的。
- 帧率(Frames Per Second, FPS):帧率是指每秒钟显示的帧数。较高的帧率可以带来更流畅的动画效果,通常的帧率目标是 60 FPS。
- 时间间隔(Delta Time):这是指每一帧之间的时间间隔。clock.tick(FPS) 函数通过控制这个时间间隔来实现固定帧率。
pygame.time.Clock 对象的 tick 方法会确保每次调用 tick 时程序都暂停足够长的时间,以使得每秒钟的帧数接近于指定的 FPS
- 计算帧间隔:tick 方法计算自上一次调用 tick 方法以来经过的时间(以毫秒为单位)。
- 控制帧率:根据设定的 FPS,tick 方法计算出每一帧应该持续的时间。例如,对于 60 FPS,每帧应该持续大约 16.67 毫秒(1000 毫秒 / 60 帧)。
- 延时:如果计算得出的时间间隔小于应该持续的时间,tick 方法会让程序休眠(延时)一段时间,以确保帧率不会超过设定的值。
五、发散思考:如果游戏运行过慢怎么办
如果游戏运行过慢,帧率控制就不起作用了。可以在游戏每一帧运行完之后,让程序休眠0.1s,游戏会运行地很慢
import time
...
time.sleep(0.1)
clock.tick(FPS)