[英]Is there a way to increase the CPU power given to a python program? (Python 3.5, Mac)
我有這個程序,您可以在其中比賽,並且必須避開飄落的雪花。 一旦死亡,屏幕上就會繪制文字游戲,而雪花繼續飄落。 因為那時的過程比較簡單(無需鍵盤輸入或移動匹配等),所以用於執行程序的CPU能力減少了約4%。 但是,繪制文本需要更長的時間,因此雪花都變慢了。
有沒有辦法告訴python在程序中使用更多可用的CPU能力以使其運行更快?
這是我使用的drawText方法:
def drawText(window, text, size, color, centerX, centerY):
font=pygame.font.Font("DickensianChristmas.ttf", size)
renderedText=font.render(str(text),True,color)
textpos=renderedText.get_rect()
textpos.centerx=centerX
textpos.centery=centerY
window.blit(renderedText, textpos)
這是正常運行的主要代碼:
while True:
ticks += 1
window.fill((200,200,200))
#Increase difficulty with time
if ticks%increaseRate == 0:
snowFrequency *= 0.925
snowSpeed += 0.125
speed += 0.15
#Generate Speed Boost
if randint(1,speedFrequency) == 1 and not(speedOnScreen):
speedOnScreen = True
speedX = randint(0,1180)
speedY = -120
#Generate Shield
if randint(1,shieldFrequency) == 1 and not(shieldOnScreen):
shieldOnScreen = True
shieldX = randint(0,1180)
shieldY = -120
#Move, draw, pick up, and delete speed boost
if speedOnScreen:
speedY += snowSpeed
window.blit(speedBoost, (speedX,speedY))
if 700 > speedY > 472 and matchX+15 > speedX > matchX-120:
speedStart = ticks
speedOnScreen = False
if speedY > 700:
speedOnScreen = False
#Move, draw, pick up, and delete shield
if shieldOnScreen:
shieldY += snowSpeed
window.blit(shield, (shieldX,shieldY))
if 700 > shieldY > 472 and matchX+15 > shieldX > matchX-107:
shieldStart = ticks
shieldOnScreen = False
if shieldY > 700:
shieldOnScreen = False
#Sheilding effect
if ticks > shieldStart+shieldDuration:
invincible = False
else:
invincible = True
window.blit(pygame.transform.scale(shield, (55,60)), (1240,0))
pygame.draw.line(window,(0,0,0),(1270,75),(1270, 75+shieldDuration-(ticks-shieldStart)),25)
#Speed Boost Effect
if ticks > speedStart+speedDuration:
speed = baseSpeed
tilt = tiltAmount
else:
speed = baseSpeed*2
tilt = tiltAmount*1.5
window.blit(pygame.transform.scale(speedBoost, (60,60)), (0,0))
pygame.draw.line(window,(0,0,0),(30,75),(30, 75+speedDuration-(ticks-speedStart)),25)
#Draw Score
drawText(window, score, 96, (0,0,0), 650, 50)
#Make snowflakes
if randint(1,round(snowFrequency)) == 1:
# IMAGE X-COORDINATE Y-COORDINATE
snowflakes.append([snowflakeImages[randint(0,5)], randint(0,1234), -64])
#Move snowflakes (different kinds move differently)
for flake in snowflakes:
if flake[0] == snowflake1:
flake[2] += snowSpeed*0.8
flake[1] += randint(-2,1)
elif flake[0] == snowflake2:
flake[2] += snowSpeed*0.8
flake[1] += randint(-1,2)
elif flake[0] == snowflake3 or flake[0] == snowflake4:
flake[2] += snowSpeed*1.25
flake[1] += randint(-1,1)
else:
flake[2] += snowSpeed
flake[1] += randint(-2,2)
#Draw snowflakes
# IMAGE LOCATION
window.blit(flake[0], (flake[1],flake[2]))
#Remove snowflakes that go off screen and increase score
if flake[2] > 700:
snowflakes.remove(flake)
score += 1
#Compensate for matches rotation
addDegrees = 0
if degrees < 0:
addDegrees = degrees
#Collision detection
if 631 > flake[2] > 528 and matchX+15+addDegrees > flake[1] > matchX-64-addDegrees:
if invincible:
snowflakes.remove(flake)
score += 2
else:
gameOver(window, snowflakes)
#Detect quit
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
done(window)
#Match movement
keys = pygame.key.get_pressed()
if (keys[K_a] or keys[K_LEFT]):
if degrees > -tilt:
degrees -= tiltSpeed
matchX -= speed
if (keys[K_d] or keys[K_RIGHT]):
if degrees < tilt:
degrees += tiltSpeed
matchX += speed
if not (keys[K_a] or keys[K_LEFT] or keys[K_d] or keys[K_RIGHT]):
if degrees > 0:
degrees -= tiltSpeed
matchX += tiltSpeed*2
if degrees < 0:
degrees += tiltSpeed
#Draw match
window.blit(pygame.transform.rotate(match, degrees),(matchX, 592))
#Move oss-screen side-switching
if matchX < 15:
matchX += 1300
elif matchX > 1285:
matchX -= 1300
#Update display
pygame.display.update()
以下是游戲結束后運行速度較慢的代碼:
while True:
window.fill((200,200,200))
window.blit(burntOut4, (matchX,592))
drawText(window, score, 96, (0,0,0), 650, 50)
drawText(window, "GAME OVER!", 120, (0,0,0), 650, 350)
if beatHS:
drawText(window, "NEW HIGHSCORE!", 80, (0,0,0), 650, 450)
else:
drawText(window, "HIGHSCORE: "+highScore, 80, (0,0,0), 650, 450)
if randint(1,round(snowFrequency)) == 1:
snowflakes.append([snowflakeImages[randint(0,5)], randint(0,1234), -64])
for flake in snowflakes:
if flake[0] == snowflake1:
flake[2] += snowSpeed*0.8
flake[1] += randint(-2,1)
elif flake[0] == snowflake2:
flake[2] += snowSpeed*0.8
flake[1] += randint(-1,2)
elif flake[0] == snowflake3 or flake[0] == snowflake4:
flake[2] += snowSpeed*1.25
flake[1] += randint(-1,1)
else:
flake[2] += snowSpeed
flake[1] += randint(-2,2)
window.blit(flake[0], (flake[1],flake[2]))
if flake[2] > 700:
snowflakes.remove(flake)
pygame.display.update()
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
pygame.quit()
sys.exit(0)
我已驗證是通過注釋掉它使文本放慢了速度。 可能比使用更多的CPU更有效地繪制文本嗎?
我認為一旦開始在屏幕上繪制文本,繪制所有雪花的處理能力也會大大提高。 將圖像拖到表面比將表面拖到表面要慢得多。 因此,隨着大量的雪花(除了文字之外),所有的斑點疊加起來了。
例如(游戲循環外):
enemy_rect = get_image("enemy.png").get_rect()
enemy_surface = pygame.Surface((enemy_rect.width, enemy_rect.height), pygame.SRCALPHA)
enemy_surface.fill((0, 0, 0, 0))
enemy_surface.blit(get_image("enemy_reveal_camo.png"), enemy_rect)
因此,現在將其blit到屏幕上(游戲循環內):
screen.blit(enemy_surface, (x, y))
快於:
enemy = get_image("enemy.png") # outside game loop
screen.blit(enemy, (x, y)) # inside game loop
這可能無法完全解決您的問題,但將有助於提高繪圖效率。 您實際上是在預繪制圖像。 至少值得一試,當我在屏幕上繪制一堆單獨的圖像時,它為我的游戲創造了奇跡。
如果您還想使文本繪制更有效,請將字體加載和渲染拉出游戲循環。 因此,您可以預渲染文本,並且只需在代碼內更新位置即可。 就像圖像一樣,您可以將文本預先繪制到游戲循環外部的曲面上,因為它是靜態放置的。
總是在游戲循環之外盡可能多地進行預繪畫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.