gpt4 book ai didi

python - 我使用的列表有误吗?这个简单的 python/pyglet 代码中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 09:09:21 25 4
gpt4 key购买 nike

我正在用 pyglet 编写一个简单的“避免掉落的敌人”类型的游戏。对象在屏幕上方生成,向下移动,并在通过可见屏幕下方时被销毁。但是,我做的事情非常错误,程序运行的时间越长,对象的数量就会越来越多。 (速度变慢了,我发现了 objgraph 的问题。)当我删除这个类时,问题就消失了。

坠落的敌人等级:

class Enemy(pyglet.sprite.Sprite):
def __init__(self, **kwargs):
super(Enemy, self).__init__(img=images.enemy_anim["front"], **kwargs)
self.out_of_bounds = False

def update(self, dt):
self._move(dt)
self._check_boundaries(dt)
self._check_kill_condition()

def _move(self, dt):
self.y -= ENEMY_SPEED * dt

def _check_boundaries(self, dt):
if self.y + self.height < 0:
self.out_of_bounds = True

def _check_kill_condition(self):
if self.out_of_bounds:
enemy_list.remove(self)
self.delete

主要方法代码:

enemy_list = []

def add_enemy(*args, **kwargs):
randx = random.randint(0,
WINDOW_WIDTH - images.enemy_anim["front"].get_max_width())
randy = WINDOW_HEIGHT + images.enemy_anim["front"].get_max_height()
enemy_list.append(Enemy(x=randx, y=randy, batch=update_batch))

def update(dt):
for sprite in enemy_list:
sprite.update(dt)

#send the above functions to the pyglet scheduler
pyglet.clock.schedule_interval(update, 1/TICKS_PER_SECOND)
pyglet.clock.schedule_interval(add_enemy, 1/ENEMY_ADD_RATE)

我将我的敌人动画存储在字典 (images.enemy_anim) 的单独模块(图像)中。

我用列表中的引用创建了一个敌人。

当敌人死亡时,我告诉它从列表中删除自己。我在运行时检查了列表的长度,它总是合适的长度。所以这份名单并没有失控。该对象从列表中删除后应该没有任何引用,对吧?

我做错了什么?

编辑:

问题是我有 self.delete 而不是 self.delete()。愚蠢的错误...

最佳答案

我不会在它自己的方法中删除对象,而是采用不同的方法并像这样在额外的 schedule_interval 中删除 Sprite :

def delete_enemy(*args, **kwargs):
items_to_delete = []
for enemy in enemy_list:
if enemy.out_of_bounds:
items_to_delete.append(enemy)
for item in items_to_delete:
enemy_list.remove(item)

pyglet.clock.schedule_interval(delete_enemy)

当然,删除 Enemy.update 中的 self._check_kill_condition() 行。

编辑: 我不知道 pyglet,但如果这种方法也不起作用,那么 pyglet 中的某些内容会保留对您的 sprite 的引用。可以在 Canvas 或某些类似对象中引用 Sprite 。 pyglet 中应该有一个 API 调用来完全删除 Sprite(即从 Canvas 中删除)。然后应该在我的 enemy_list.remove(item) 调用之后立即使用此调用。

关于python - 我使用的列表有误吗?这个简单的 python/pyglet 代码中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17103791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com