PyGame - низкий FPS с простой имитацией спрайтов - PullRequest
0 голосов
/ 18 июня 2019

В настоящее время работает над чрезвычайно простым моделированием естественного отбора на Python с использованием PyGame.Ранее я делал этот проект на Java и реплицирую его на Python для будущих функций.Тем не менее, когда я начал работать над PyGame, я заметил, что на каждом симуляторе наблюдаются очень низкие (на 5,67 кадров в секунду) значения независимо от количества спрайтов.От 1 (5,7 к / с) спрайта до 500 (5 к / с) у меня все еще очень низкий FPS.

Вот мои три файла, которые у меня сейчас есть для проекта, всего около 100 строк кода, большинствоэто комментарии и пробел.

evolution.py (основной)

## Import Libraries
import sys, pygame, organism, utils

## Initialize
pygame.init()

## Screen Details
size = width, height = 1280, 720
background = (100, 100, 100)
screen = pygame.display.set_mode(size)

## User Inputs
orgCount = input("Starting count of organisms? ")
# (Not added)
#foodCount = input("Starting count of food? ")

## Dictionaries and Sprite Groups
# Organisms
orgDict = {}
orgGroup = pygame.sprite.Group()
# Food (Not added)
#foodDict = {}
#foodGroup = pygame.sprite.Group()

## Add starting values
utils.orgAdd(orgDict, orgGroup, int(orgCount))

print(orgDict)

## Loop until the user clicks the close button.
done = False
clock = pygame.time.Clock()

""" Simulation """
while not done:
    ## Exit
    for event in pygame.event.get():
        if event.type == pygame.QUIT: done = True

    ## Display FPS
    pygame.display.set_caption("FPS:" + str(clock.get_fps()))

    ## Set background color
    screen.fill(background)

    orgGroup.update()

    ## Organism render
    orgGroup.draw(screen)

    clock.tick(120)

    ## Update the screen
    pygame.display.flip()

## Idle friendly code
pygame.quit()

utils.py

import organism

# Add new organism(s) with UUID to a dictionary and sprite group
def orgAdd(dictionary, group, quantity=1):
    if quantity > 0:
        org = organism.Organism()
        dictionary[org.uuid] = org
        group.add(org)
        orgAdd(dictionary, group, quantity - 1)

animal.py

import pygame, uuid, random

size = width, height = 1280, 720
WHITE = (255, 255, 255)

class Organism(pygame.sprite.Sprite):
    def __init__(self, size=25, color=(125, 0, 125), position=(0,0)):
        """ Sprite Initialization """
        super().__init__()

        """ Organism Statistics """
        # Unique User ID
        self.uuid = uuid.uuid1()
        # Color
        self.color = color
        # Size
        self.size = size
        # Position
        if position == (0,0):
            self.position = (random.randrange(0,width), random.randrange(0,height))
        else:
            self.position = position

        # Create the surface of the sprite
        self.image = pygame.Surface((size, size))
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)

        # Draws the circle on the surface of the sprite
        pygame.draw.circle(self.image, self.color, [self.size//2, self.size//2] , size//2)

        # Sets the initial position of the sprite
        self.rect = pygame.Rect(self.position, (self.size, self.size))
        print(self.position)

    def update(self):
        self.rect.move_ip(random.randrange(-10,10), random.randrange(-10,10))

Редактировать

Некоторая дополнительная информация, если это поможет: Python версии 3.6.5 (любая версия, кроме этой, не будет запускать PyGameв OSX Mojave, о которой сообщают многие пользователи) PyGame версия 1.9.6 OSX Mojave на Macbook Pro 2018 года

Edit 2

Пример распечатки при запуске симуляции с 10 организмами (спрайтами)

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
(619, 2)
(1025, 575)
(1032, 675)
(854, 147)
(459, 456)
(495, 626)
(105, 359)
(1210, 14)
(855, 457)
(1095, 506)
{UUID('6d94ed68-9188-11e9-8062-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a706e-9188-11e9-a66d-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a73ca-9188-11e9-9e14-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a7674-9188-11e9-8c5b-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a7a0a-9188-11e9-aad7-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a7dde-9188-11e9-8c17-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a814c-9188-11e9-9b2f-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a85a4-9188-11e9-8cff-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a88ec-9188-11e9-ae0a-acde48001122'): <Organism sprite(in 1 groups)>, UUID('6d9a8b3a-9188-11e9-ac44-acde48001122'): <Organism sprite(in 1 groups)>}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...