#python-3.x #graphics #pygame
#python-3.x #графика #pygame
Вопрос:
Для проекта моделирования мне нужно создать и управлять огромным количеством отдельных пикселей и небольших GIF-файлов в графической среде под управлением python. Я попытался «graphics.py «. Но он выходит из строя после добавления около 3000 объектов. Код ошибки не говорит сам за себя:
«Python перестал работать» Подпись проблемы: Имя события проблемы: APPCRASH Имя приложения: python.exe Версия приложения: 3.5.1150.1013 Временная метка приложения: 576eff6a Имя модуля неисправности: tcl86t.dll
У вас есть какие-либо идеи, в чем проблема? Даже, есть «graphics.py » подходит для работы с большим количеством предметов? Спасибо
ДОБАВЛЕНО: Вот пример того, когда я создаю экземпляр нового объекта или перемещаю его:
…
self.image__ = Image(Point(self.x_, self.y_), 1, 1)
#shaping image with some pixels
self.shape_single_cell()
#sending image to the screen
CreatureSingleCell.world_handle__.draw_image(self.image__)
…
#moving the image to a new spot in the screen
def action_single_cell_moving(self, dx, dy):
self.image__.move(dx, dy)
Комментарии:
1. Не могли бы вы опубликовать код, с которым у вас возникли проблемы?
2. Это graphics.py имея в виду это ? На первый взгляд кажется, что он основан на tkinter, поэтому я не уверен, насколько быстро он будет работать. Это также может помочь узнать, что именно вы делаете в симуляции. Собираетесь ли вы взаимодействовать с этими GIF-файлами и иметь пользовательский интерфейс или больше внимания уделяется их простому рендерингу?
3. На самом деле код очень длинный и сложный, непригодный для публикации здесь. В некоторых ситуациях я создаю новые пиксели или изображения на экране. И при каждом временном тике они перемещаются на несколько пикселей в направлении, основанном на симуляции. Довольно просто, единственная проблема — это их количество. Когда происходит сбой, неясно, какая часть кода несет ответственность.
4. @user2588654 да, iti — это графика Зелле. Вычисления и моделирование выполняются очень надежно и быстро. На самом деле, они были тщательно протестированы без графического интерфейса. Графический интерфейс предназначен только для представления результатов моделирования в реальном времени. Я не получаю входные данные от GUI.
5. Итак, вы манипулируете отдельными пикселями в каждом кадре и перемещаете их, или вы перемещаете спрайты / изображения? Если вы «перемещаете» отдельные пиксели, то, возможно, при моделировании необходимо создать одно полноэкранное / оконное текстурное изображение, содержащее результирующие нужные пиксели. Затем этот единственный «quad» будет отображаться на экране в каждом кадре. Если вы манипулируете отдельными спрайтами, то вместо этого потребуется несколько квадратов, каждый из которых содержит спрайт. Также было бы полезно, если бы у нас было описание того, что сделало моделирование, или, по крайней мере, пример формата данных, которые оно выводит.
Ответ №1:
Пока это не окончательный ответ, но просто чтобы вам было на что посмотреть, я создал симуляцию, в которой у меня есть 1000 квадратов, которые случайным образом перемещаются. Используя простые, но медленные методы, включающие glBegin, о которых я упоминал в своих комментариях, я все равно получаю около 60 кадров в секунду, в то время как при 10000 объектов он падает до 7 кадров в секунду. На данный момент нет текстурирования или рождения / смерти объекта, но я подумал, что это может быть хорошим началом. Является ли это разумным представлением вашего моделирования эволюции? Также дайте мне знать, какую производительность вы получаете на своем компьютере, и достаточно ли это быстро для ваших целей моделирования или нужно переключиться на более сложные / продвинутые методы.
from OpenGL.GL import *
from OpenGL.GL import shaders
from OpenGL.GLU import *
import math
import pygame
import random
import sys
import time
class Creature(object):
def __init__(self):
self.size = 10
self.x = 0
self.y = 0
def move(self, dx, dy):
self.x = dx
self.y = dy
def set_pos(self, x, y):
self.x = x
self.y = y
class Simulation(object):
def __init__(self, world_size, num_creatures=1000, max_move=1):#not really max by pythagorean theorem
self.width, self.height = world_size
self.max_move = max_move
self.creatures = self.setup(num_creatures)
def setup(self, num_creatures):
creatures = []
for i in range(num_creatures):
x = int(random.random()*self.width)
y = int(random.random()*self.height)
creature = Creature()
creature.set_pos(x, y)
creatures.append(creature)
return creatures
def update(self):
for creature in self.creatures:
dx = int(round(random.uniform(-self.max_move, self.max_move)))
dy = int(round(random.uniform(-self.max_move, self.max_move)))
creature.move(dx, dy)
if __name__ == "__main__":
width = 800
height = 600
title = "Random Simulation"
target_fps = 60
pygame.init()
size = (width, height)
flags = pygame.DOUBLEBUF|pygame.OPENGL
pygame.display.set_mode(size, flags)
pygame.display.set_caption(title)
c = Creature()
sim = Simulation(size)
prev_time = time.time()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.quit()
sim.update()
glClear(GL_COLOR_BUFFER_BIT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, width, height, 0, -1, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
for i in sim.creatures:
glBegin(GL_QUADS)
glVertex(i.x - i.size/2.0, i.y - i.size/2.0)
glVertex(i.x i.size/2.0, i.y - i.size/2.0)
glVertex(i.x i.size/2.0, i.y i.size/2.0)
glVertex(i.x - i.size/2.0, i.y i.size/2.0)
glEnd()
pygame.display.flip()
curr_time = time.time()
diff = curr_time - prev_time
delay = max(1.0/target_fps - diff, 0)
time.sleep(delay)
fps = 1.0/(delay diff)
prev_time = curr_time
pygame.display.set_caption("{0}: {1:.2f}".format(title, fps))