В настоящее время работает над чрезвычайно простым моделированием естественного отбора на 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)>}