Python 3.x 特金特帆布

Python 3.x 特金特帆布,python-3.x,tkinter,Python 3.x,Tkinter,我想在画布上做一颗移动的子弹。我删除它并在每一帧重新绘制它。仅绘制了大约4/5个图形之后,画布仍然会变慢。我错过了什么 class Bullet: def __init__(self,x,y,r,vx,vy): # realX/Y represent the real location of the bullet as a float self.realX = x self.realY = y self.vx = vx

我想在画布上做一颗移动的子弹。我删除它并在每一帧重新绘制它。仅绘制了大约4/5个图形之后,画布仍然会变慢。我错过了什么

class Bullet:
    def __init__(self,x,y,r,vx,vy):
        # realX/Y represent the real location of the bullet as a float
        self.realX = x
        self.realY = y
        self.vx = vx
        self.vy = vy
        self.r = r # Radius
        self.speed = 0.96 # Pixels per frame

def level1_loop():
    move_bullets()

    draw()
    window.after(1,level1_loop)

def move_bullets():
    global timer
    global canvas

    if time() > timer + 1:
        # Create a new bullet every second
        newbul = Bullet(rand(0,1920),0,20,0,0)
        diffX = window.winfo_pointerx() - newbul.realX
        diffY = window.winfo_pointery() - newbul.realY
        scale = newbul.speed / (diffX ** 2 + diffY ** 2) ** 0.5
        newbul.vx = diffX*scale
        newbul.vy = diffY*scale
        bullets.append(newbul)
        timer = time()

    for bullet in bullets:
        # Update bullet position
        bullet.realX += bullet.vx
        bullet.realY += bullet.vy

def draw():
    global canvas
    canvas.delete('bullet')
    for bullet in bullets:
        canvas.create_oval(bullet.realX-bullet.r,bullet.realY-bullet.r,bullet.realX+bullet.r,bullet.realY+bullet.r,tag="bullet")
        if bullet.realX > 1920 or bullet.realY > 1080:
            bullets.remove(bullet)

它很慢,特别是因为您正在删除和重新绘制项目符号。相反,您应该移动现有项目符号,而不是重新绘制它们。当您创建大量画布项时,画布存在已知的性能问题,即使您删除了画布项。画布项目ID不可回收,因此画布必须维护的项目ID列表会无限增长,并使画布在每次迭代中都变慢

它也很慢,因为你试图每秒重画1000次,即使你的眼睛看不到任何接近它的东西。你正在浪费大量的cpu周期去做一些你感觉不到的事情

下面是从事底层Canvas实现工作的人员提供的类似建议: