Python 游戏速度问题
我偶然发现了这种奇怪的速度行为,我无法为自己解释。如果主循环中的Python 游戏速度问题,python,pygame,clock,Python,Pygame,Clock,我偶然发现了这种奇怪的速度行为,我无法为自己解释。如果主循环中的print clock.tick()行未被勾选,则红方块在屏幕宽度上移动更流畅。有人能解释为什么会这样吗 import pygame from pygame.locals import * class Box(pygame.sprite.Sprite): def __init__(self,color,init_pos): super(Box, self).__init__() sel
print clock.tick()
行未被勾选,则红方块在屏幕宽度上移动更流畅。有人能解释为什么会这样吗
import pygame
from pygame.locals import *
class Box(pygame.sprite.Sprite):
def __init__(self,color,init_pos):
super(Box, self).__init__()
self.image=pygame.Surface([50,50])
self.image.fill(color)
self.rect=self.image.get_rect()
self.rect.topleft=init_pos
self.speed=300
def update(self,time_passed):
moved_distance=self.speed*time_passed
self.rect.left+=moved_distance
pygame.init()
screen=pygame.display.set_mode([640,480])
box=Box((255,0,0),(0,0))
clock=pygame.time.Clock()
while True:
for e in pygame.event.get():
if e.type==QUIT:
pygame.quit()
screen.fill((0,0,0))
time_passed=clock.tick()/1000.0
box.update(time_passed)
print clock.tick() #this line uncommented moves the red sqaure faster, why?
screen.blit(box.image,box.rect)
pygame.display.flip()
clock.tick
正在更新游戏时钟,应每帧调用一次。在您的代码中,您不仅要打印经过的毫秒数,还需要在只需要一次的情况下多次更新游戏时钟(将函数传递到print
,仍将调用该函数)
您也没有为时钟使用可选的帧速率
参数。勾选
功能可用于锁定帧速率或屏幕变化速度。如果未锁定,对象可能会以不同的速度移动——正如您所说的那样更流畅
如果要打印经过的毫秒数,只需打印time\u passed
变量即可
以下是关于时钟的信息供参考。勾选我的答案所用的
关于你在评论中的后续问题:
我将打印行更改为打印“你好!”并且它仍然具有与打印clock.tick()相同的效果。我的目标不是移动或不移动红场,而是理解为什么打印对速度有如此大的影响。当在主循环中的某个位置放置打印时,它也会加速循环,一旦打印被注释,移动就处于空闲状态
与主循环中的任何其他代码一样,print
语句将占用CPU时间。时钟更新之间经过的时间越多,经过的时间越长
该值越大,长方体移动越快。假设自上次更新以来需要10毫秒,因此timed\u已通过
=10/1000.0=0.01秒。我们调用您的框。更新,移动距离为300*0.01=3。太好了,它向右移动了3个单位。但是,它可能会移动得更快或更慢,因为您没有锁定帧速率,因此速度将发生变化
现在,时钟更新之间经过的时间越短,经过的时间越短。您注释掉print
语句,该框处于空闲状态;为什么?假设自上次更新以来需要1毫秒,因为您没有处理print
语句或任何其他代码<代码>经过的时间
=1/1000.0=0.001秒。我们更新您的红方块和移动距离=300*0.001=0.3
盒子应该向右移动多少个单位?0为什么?因为rect.left
是一个整数。0.3将变为0,即框处于空闲状态。时钟。勾号
正在更新游戏时钟,应每帧调用一次。在您的代码中,您不仅要打印经过的毫秒数,还需要在只需要一次的情况下多次更新游戏时钟(将函数传递到print
,仍将调用该函数)
您也没有为时钟使用可选的帧速率
参数。勾选
功能可用于锁定帧速率或屏幕变化速度。如果未锁定,对象可能会以不同的速度移动——正如您所说的那样更流畅
如果要打印经过的毫秒数,只需打印time\u passed
变量即可
以下是关于时钟的信息供参考。勾选我的答案所用的
关于你在评论中的后续问题:
我将打印行更改为打印“你好!”并且它仍然具有与打印clock.tick()相同的效果。我的目标不是移动或不移动红场,而是理解为什么打印对速度有如此大的影响。当在主循环中的某个位置放置打印时,它也会加速循环,一旦打印被注释,移动就处于空闲状态
与主循环中的任何其他代码一样,print
语句将占用CPU时间。时钟更新之间经过的时间越多,经过的时间越长
该值越大,长方体移动越快。假设自上次更新以来需要10毫秒,因此timed\u已通过
=10/1000.0=0.01秒。我们调用您的框。更新,移动距离为300*0.01=3。太好了,它向右移动了3个单位。但是,它可能会移动得更快或更慢,因为您没有锁定帧速率,因此速度将发生变化
现在,时钟更新之间经过的时间越短,经过的时间越短。您注释掉print
语句,该框处于空闲状态;为什么?假设自上次更新以来需要1毫秒,因为您没有处理print
语句或任何其他代码<代码>经过的时间
=1/1000.0=0.001秒。我们更新您的红方块和移动距离=300*0.001=0.3
盒子应该向右移动多少个单位?0为什么?因为rect.left
是一个整数。0.3将变为0,即框处于空闲状态。我将打印行更改为打印“你好!”
,它仍然具有与打印时钟.勾选()相同的效果。
。我的目标不是移动或不移动红场,而是理解为什么打印<代码>会对速度产生如此大的影响。当你在主循环的某个地方放置print
时,它也会加速循环,只要print
被注释,移动就处于空闲状态。@AmirTeymuri请查看我最初答案的更新。现在这绝对有意义了!我将打印行更改为打印“你好!”
,它仍然与打印clock.tick()
具有相同的效果。我的目的不是要移动或不移动红场,而是要理解为什么要放置一个标记