How to see how many FPS there are in pygame

This scripts shows you how many sprites you can handle with pygame.

import os

from random import randrange

# Imports organized in order to work both with Pygame and Pyjsdl
try:
    import pygame as pg
    from pygame.math import Vector2

    platform = "standalone"
    res_dir = "public"
except ImportError:
    import pyjsdl as pg
    from pyjsdl.vector import Vector2

    platform = "web"
    res_dir = ""

from fps_counter import FPSCounter
from widgets import Button, Label, HBox, VBox, Widget
from sprite import RandomSprite


class Game:
    def __init__(self, screen_size, max_fps):
        self.screen_size = screen_size
        self.max_fps = max_fps

        self.img = None
        self.sprites = []
        self.sprites_moving = True

        self.fps_counter = FPSCounter()
        self.running = True
        
        pg.init()
        self.clock = pg.time.Clock()
        self.screen = pg.display.set_mode(screen_size)
        pg.display.set_caption("Snake mark")

        # Create some UI
        self.ui_root = Widget(None, 0, 0, self.screen_size.x, self.screen_size.y)
        
        hbox = HBox(self.ui_root, h_anchor="right")
        Button(hbox, "+ 100", lambda: self.add_sprites(100))
        Button(hbox, "- 100", lambda: self.remove_sprites(100))
        self.toggle_btn = Button(hbox, "Stop", self.toggle_moving)
        Button(hbox, "Clear", self.clear)
        hbox.layout()
        
        vbox = VBox(self.ui_root, spacing=0, h_anchor="left")
        self.fps_label = Label(vbox, "FPS:", w=120)
        self.sprite_count_label = Label(vbox, "Sprites:", w=120)
        vbox.layout()
              
        if platform == "web":
            pg.setup(self.web_init,["snake.png"])
        else:
            self.prerun()
            while self.running:
                self.game_loop()

    def add_sprites(self, num):
        for _ in range(0, num):
            spr = RandomSprite(
                self.img, 0, 0, self.screen_size.x, self.screen_size.y, -100, 100
            )
            self.sprites.append(spr)

    def remove_sprites(self, num):
        if len(self.sprites) >= num:
            self.sprites = self.sprites[num:]

    def toggle_moving(self):
        if self.sprites_moving:
            self.sprites_moving = False
            self.toggle_btn.set_text("Move")
        else:
            self.sprites_moving = True
            self.toggle_btn.set_text("Stop")

    def clear(self):
        self.sprites = []

    def prerun(self):
        # Convert image for better performance
        # self.img = pg.image.load(os.path.join(res_dir, "snake.png"))
        # self.img = pg.image.load(os.path.join(res_dir, "snake.png")).convert()
        self.img = pg.Surface((10, 10))
        pg.draw.circle(self.img, (0,255,255), (5,5), 5, 2)
        self.img.set_colorkey((0,0,0))
        # self.img.fill((255,0,0))
        # Scale it 2 times
        # self.img = pg.transform.scale2x(self.img)
        self.add_sprites(100)


    def web_init(self):
        self.prerun()
        pg.set_callback(self.game_loop)

    def game_loop(self):
        for e in pg.event.get():
            if e.type == pg.QUIT or e.type == pg.KEYDOWN and e.key == pg.K_ESCAPE:
                pg.quit()
                self.running = False

        self.screen.fill((0, 0, 0))

        dt = self.clock.get_time() / 1000

        for spr in self.sprites:
            if self.sprites_moving:
                spr.update(dt)
            spr.draw(self.screen)

        for e in self.ui_root.children:
            e.update(dt)
            e.draw(self.screen)

        self.fps_counter.update(dt)
        # Pyjsdl doesn't support Python 3 string interpolation
        self.sprite_count_label.set_text("Sprites: {}".format(len(self.sprites)))
        self.fps_label.set_text("FPS: {}".format(self.fps_counter.get_fps()))

        pg.display.flip()

        self.clock.tick(self.max_fps)


if __name__ == "__main__":
    screen_size = Vector2(800, 600)
    max_fps = 60
    game = Game(screen_size, max_fps)

Video


Subscribe to the newsletter for updates
Tkinter templates
My youtube channel

Twitter: @pythonprogrammi - python_pygame

Videos

Speech recognition game

Pygame's Platform Game

Other Pygame's posts