簡體   English   中英

有沒有辦法增加提供給python程序的CPU功能? (Python 3.5,Mac)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM