我认为问题可能在于冲压调用 Screen.update()
背景,虽然我还没有证实这一点。
这似乎是真的,很容易确认,但不一定是整个问题。下面是我通过仅删除已失效的邮票 ID 来优化它的代码的返工,但它看起来并不比你的好。你可以看到我已经注释掉了 screen.update()
,这没什么区别:
from turtle import Screen,Turtle
def move_blocks():
new_block = blocks.pop(0)
new_block[0] = blocks[-1][0] + 20
if new_block[0] > 250:
new_block[0] = -250
blocks.append(new_block)
stamper.goto(new_block)
stamper.clearstamp(ids.pop(0))
ids.append(stamper.stamp())
# screen.update()
screen.ontimer(move_blocks,100)
screen = Screen()
screen.setup(500,500)
screen.tracer(0) # Turn off automatic animation
stamper = Turtle('square')
stamper.hideturtle()
stamper.penup()
blocks = [[0,0],[20,[40,[60,0]]
ids = []
for block in blocks:
stamper.goto(block)
ids.append(stamper.stamp())
# screen.update()
move_blocks()
screen.exitonclick()
为了聪明,我想对 drawing 与 stamping 进行比较,但结果是一样的,填充操作触发了 screen.update()
让我们回到起点:
from turtle import Screen,Turtle
CURSOR_SIZE = 20
def move_blocks():
filler.clear()
new_block = blocks.pop(0)
new_block[0] = blocks[-1][0] + 20
if new_block[0] > 250:
new_block[0] = -250
blocks.append(new_block)
for block in blocks:
fill(block)
# screen.update()
screen.ontimer(move_blocks,100)
def fill(position):
filler.goto(position)
filler.begin_fill()
for _ in range(4):
filler.forward(CURSOR_SIZE)
filler.left(90)
filler.end_fill()
screen = Screen()
screen.setup(500,500)
screen.tracer(0) # Turn off automatic animation
filler = Turtle()
filler.hideturtle()
filler.penup()
blocks = [[0,0]]
for block in blocks:
fill(block)
# screen.update()
move_blocks()
screen.exitonclick()
最后,我做了一个由 tracer()
和程序员发起的 screen.update()
调用控制的实现。我只是重塑光标并移动它以进行比较。这次将 screen.update()
注释掉后,您可以看到不同之处。
from turtle import Screen,Turtle
CURSOR_SIZE = 20
CURSOR_LENGTH = 80
STEP_SIZE = 1
def move():
x = turtle.xcor() + STEP_SIZE
if x - CURSOR_LENGTH/2 > 250:
turtle.setx(-250 - CURSOR_LENGTH/2)
else:
turtle.forward(STEP_SIZE)
screen.update()
screen.ontimer(move,5 * STEP_SIZE)
screen = Screen()
screen.setup(500,500)
screen.tracer(0) # Turn off automatic animation
turtle = Turtle()
turtle.shape('square')
turtle.shapesize(stretch_len=CURSOR_LENGTH/CURSOR_SIZE)
turtle.penup()
screen.update()
move()
screen.exitonclick()
然而,这个实现指出,早期的糟糕的视觉性能也是由于步长很大——如果你改变STEPSIZE = CURSOR_SIZE
,那么你的步长和性能与你原来的一样.
本文链接:https://www.f2er.com/8664.html