回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我目前正在设计一个应用程序,使用pygame,其中我有许多圆圈通过线连接起来,数字文本写在其中。这些圆圈是绿色、蓝色和红色的,而其他的东西是黑色的。背景是白色的。(把它想象成一个网络图)</p>
<p><strong>我的目标</strong>:我正在尝试运行一个动画,在该动画中,用户选择两个圆(我们称它们为节点),我找出发送方节点(绿色)到接收方节点(红色)之间的最短路径。因此,在这个动画中,我在连接两个相邻节点(可能是中间节点)的线(或边)顶部制作另一个移动圆</p>
<p><a href="https://i.stack.imgur.com/zAlR2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/zAlR2.png" alt="for e.g, the circle moves from node 2 to node 11 here"/></a></p>
<p>到目前为止一切都很好,以下是我正在做的代码:</p>
<pre><code>def runPathAnimation(path, colortype):
for i in range(len(path)-1):
#Calculation of the center of the nodes
x1, y1 = (gmd[path[i]].getNodePosition())[0], (gmd[path[i]].getNodePosition())[1]
x2, y2 = (gmd[path[i+1]].getNodePosition())[0], (gmd[path[i+1]].getNodePosition())[1]
#Get the slope
m = (y1-y2)/(x1-x2) if x1 != x2 else 'undefined'
if str(m) != 'undefined':
c = y2-(m*x2)
if m > 0.5 or (m <= -1 and m >= -1.5):
for y in range(min(y1,y2),max(y1,y2)):
#using the equation of the line
x = int((y-c)/m)
#redrawEverything(path) #OPTION 1
#TRY REDRAW LINE #TODO
pyg.draw.rect(screen, (255, 255, 255), (x-10,y-10,20,20)) #OPTION 2
pyg.draw.circle(screen, colortype, (x,y), 10) #Moving circle
pyg.display.update() #Update Display
#NEED: Redraw!
#The logic repeats....
else:
for x in range(min(x1,x2),max(x1,x2)):
y = int(m*x+c)
#redrawEverything(path)
#TRY REDRAW LINE
pyg.draw.rect(screen, (255, 255, 255), (x-10,y-10,20,20))
pyg.draw.circle(screen, colortype, (x,y), 10)
pyg.display.update()
#NEED: Redraw!
else:
cy = range(min(y1,y2),max(y1,y2))
if y1 > y2:
cy = reversed(cy)
for y in cy:
#redrawEverything(path)
#TRY REDRAW LINE
pyg.draw.rect(screen, (255, 255, 255), (x1-10,y-10,20,20))
pyg.draw.circle(screen, colortype, (x1,y), 10)
pyg.display.update()
#NEED: Redraw!
</code></pre>
<p><strong>我的问题</strong>:我简单地用另一个位置更新一个圆的方法存在很大的滞后,而不会干扰它所涵盖的任何内容。我有两个选择:</p>
<ol>
<li><em>选项1</em>:更新屏幕上的所有内容(当然,它没有给我一个好的性能)</li>
<li><em>选项2</em>:仅更新屏幕的实际使用部分。然而,即使使用这种方法,我也无法实现屏幕更新的良好性能。我想稍后添加一个功能来控制动画的速度,它的速度可能比我现在代码的最高性能还要快</李>
</ol>
<p>正如您所看到的,到目前为止,我没有任何<code>time.sleep()</code>。我希望提高代码的性能,然后能够添加<code>time.sleep()</code>以获得更受控制的动画。我当前的pygame应用程序已经与另一个进程并行运行,我使用<code>multiprocessing</code>库实现了这个进程</p>
<p><strong>问题</strong>:如何加快速度</p>
<p>我的python版本:3.7.0,pygame版本:1.9.6</p>
<p>PS:对不起,问题太长了</p>