Как я могу создавать тысячи изображений и пикселей на экране одновременно? с помощью Python

#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))