Создание сущностей, уменьшение FPS и перекрытие - PullRequest
0 голосов
/ 12 ноября 2018

Я хотел бы предложить два вопроса. В проекте, над которым я работаю, я создал класс, который имеет дело со всеми созданными сущностями (врагами). Это класс (если вам нужно что-нибудь еще, скажите мне):

class entity():

    def __init__(self, main):
        self.main = main
        self.main.update_list.append(self.update)
        self.main.draw_list.append(self.on_draw)

        self.entity_spawn = []
        self.ent_made = False

    def create_entity(self, pos_x, pos_y, obj):
        data = libraries.pokémon_data(obj)
        entity = OrderedDict()
        image = self.__resource(obj, "img")
        entity["name"] = obj
        entity["tile"] = 0
        entity["image"] = OrderedDict()
        entity["texture"] = OrderedDict()
        entity["sprite"] = OrderedDict()
        for obj, item in data["img"]["battle"].items():
            entity["tile"] = item["tile"]
            entity["image"][obj] = OrderedDict()
            entity["texture"][obj] = OrderedDict()
            entity["sprite"][obj] = OrderedDict()
            id = 0
            for idy in range(len(item["y"])):
                y = item["tile"] * item["y"][idy]
                list_frame_img = []
                list_frame_texture = []
                for idx in range(len(item["x"])):
                    x = item["tile"] * item["x"][idx]
                    frame = image.get_region(x=x, y=y, width=item["tile"], height=item["tile"])
                    list_frame_img.append(frame)
                    texture = frame.get_texture()
                    gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
                    if self.main.dimension != self.main.min:
                        tile = self.__tiles(48)
                    else:
                        tile = 48
                    texture.width = tile
                    texture.height = tile
                    texture.anchor_x = texture.width // 2
                    texture.anchor_y = texture.height // 2
                    list_frame_texture.append(texture)
                if len(list_frame_img) > 1:
                    entity["image"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_img, 0.5, True)
                else:
                    entity["image"][obj][id] = list_frame_img[0]
                if len(list_frame_texture) > 1:
                    entity["texture"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_texture, 0.5, True)
                else:
                    entity["texture"][obj][id] = list_frame_texture[0]
                entity["sprite"][obj][id] = pyglet.sprite.Sprite(entity["texture"][obj][id])
                entity["sprite"][obj][id].x = pos_x
                entity["sprite"][obj][id].y = pos_y
                id += 1
        return entity

    def __tiles(self, obj):
        list = [self.main.min, self.main.max]
        res = []
        for i in range(len(list)):
            x = list[i][0]
            y = list[i][1]
            ds = (x - y) / (y / 100)
            dk = (obj / 100) * ds
            tile = obj + int(dk)
            res.append(tile)
        if (res[0] % res[1]) == 0:
            return res[0]
        else:
            return max(res[0], res[1])

    def __resource(self, obj, type):
        res = type + obj
        if res in resources[type]:
            return resources[type][type+obj][1]
        else:
            self.__error(res)
            return resources[type][type+"0000"][1]

    def __error(self, obj):
        date = datetime.datetime.now()
        self.main.error_engine.append([date.strftime("%d-%m-%Y %H:%M:%S"), obj + " missing"])

    def on_draw(self):
        for entity in self.entity_spawn:
            entity["sprite"]["idle"][0].draw()

    def update(self):
        if self.ent_made:
            if len(self.entity_spawn) < 10:
                x = random.randint(50, self.main.dimension[0] - 50)
                y = random.randint(50, self.main.dimension[1] - 50)
                entity = self.create_entity(x, y, "0001")
                self.entity_spawn.append(entity)

Первый вопрос: когда в основном классе я меняю статус self.ent_madeFalse на True), FPS резко падает с 60 до 4. Я предполагаю, что функция создания сущности тоже ест много оперативной памяти, так как я могу улучшить ее, чтобы избежать резкого падения FPS?

Второй вопрос: как я могу генерировать сущности, чтобы они не накладывались друг на друга?

Вот демонстрация того, что происходит. FPS на 40 просто потому, что я записывал, в противном случае я на 60. Более того, по второму вопросу, это происходит прежде всего, когда созданных объектов много. С 10 (ограничение, установленное только для тестирования в то время) это трудно сделать:

enter image description here

...