Python 3.x 特金特帆布
我想在画布上做一颗移动的子弹。我删除它并在每一帧重新绘制它。仅绘制了大约4/5个图形之后,画布仍然会变慢。我错过了什么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
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实现工作的人员提供的类似建议: