首页 > 解决方案 > 如何在树莓派上加速 pygame?

问题描述

我正在尝试在我的汽车屏幕上制作一组仪表。该程序在 Windows 上运行没有问题,但在 Raspberry Pi 上却很困难。

我遇到的问题是 pygame 的速度。有什么简单的方法可以加快速度吗?我试过只画一根规格的针,但它的更新速度仍然太慢。

import pygame
from controlprog import goals, farloop
import random
import time
#import threading
# Set up the drawing window
flags = pygame.FULLSCREEN | pygame.HWSURFACE
screen = pygame.display.set_mode([0,0], flags)
tempsurf = pygame.Surface((3000, 2000))
pygame.event.set_allowed([])
running = True
zeroDeg = 225
maxDeg = -45
gauge = pygame.image.load('/home/pi/pigauge2/images/gaugelow.png').convert_alpha()
needleOrd = pygame.image.load('/home/pi/pigauge2/images/needle.png').convert_alpha()
background = pygame.image.load('/home/pi/pigauge2/images/back2.png').convert()
mainback = pygame.image.load('/home/pi/pigauge2/images/mainback.png').convert()
textlayer = pygame.image.load('/home/pi/pigauge/images/textblu.png').convert_alpha()
splash = pygame.image.load('/home/pi/pigauge2/images/splash.png').convert_alpha()
window = pygame.image.load('/home/pi/pigauge2/images/window.png').convert()
task = pygame.image.load('/home/pi/pigauge2/images/task.png').convert()
f1 = pygame.image.load('/home/pi/pigauge2/images/frame/1.jpg').convert()
f2 = pygame.image.load('/home/pi/pigauge2/images/frame/2.jpg').convert()
f3 = pygame.image.load('/home/pi/pigauge2/images/frame/3.jpg').convert()
f4 = pygame.image.load('/home/pi/pigauge2/images/frame/4.jpg').convert()
f5 = pygame.image.load('/home/pi/pigauge2/images/frame/5.jpg').convert()
f6 = pygame.image.load('/home/pi/pigauge2/images/frame/6.jpg').convert()
f7 = pygame.image.load('/home/pi/pigauge2/images/frame/7.jpg').convert()
f8 = pygame.image.load('/home/pi/pigauge2/images/frame/8.jpg').convert()
f9 = pygame.image.load('/home/pi/pigauge2/images/frame/9.jpg').convert()
f10 = pygame.image.load('/home/pi/pigauge2/images/frame/10.jpg').convert()
f11 = pygame.image.load('/home/pi/pigauge2/images/frame/11.jpg').convert()
f12 = pygame.image.load('/home/pi/pigauge2/images/frame/12.jpg').convert()
f13 = pygame.image.load('/home/pi/pigauge2/images/frame/13.jpg').convert()
f14 = pygame.image.load('/home/pi/pigauge2/images/frame/14.jpg').convert()
f15 = pygame.image.load('/home/pi/pigauge2/images/frame/15.jpg').convert()
f16 = pygame.image.load('/home/pi/pigauge2/images/frame/16.jpg').convert()
f17 = pygame.image.load('/home/pi/pigauge2/images/frame/17.jpg').convert()
f18 = pygame.image.load('/home/pi/pigauge2/images/frame/18.jpg').convert()
K4 = pygame.image.load('/home/pi/pigauge2/images/frame/4k.jpg').convert()
K7 = pygame.image.load('/home/pi/pigauge2/images/frame/7k.jpg').convert()
KS = pygame.image.load('/home/pi/pigauge2/images/frame/ks.jpg').convert()
needle = needleOrd
ang = zeroDeg
extGoal = 0
moveNumOrg = 10
firstRun = True

def showshit():
    global tempsurf
    #tempsurf = pygame.transform.smoothscale(tempsurf, (1000,800))
    screen.blit(pygame.transform.scale(tempsurf, (2800, 1850)), (32,15))
    #pygame.display.update(pygame.Rect(75,75,125,125))
    pygame.display.update()

def rotate(im, angle, pivot):
    # rotate the leg image around the pivot
    image = pygame.transform.rotate(im.copy(), angle)
    rect = image.get_rect()
    rect.center = pivot
    return image, rect


def drawNeedle(goal, pos):
    global firstRun, ang, done, moveNum
    if firstRun:
        ang = zeroDeg
    firstRun = False
    needle2, pos2 = rotate(needleOrd.copy(), ang, pos)
    tempsurf.blit(needle2, pos2)
    goaltrue = -goal + 225
    if ang != goaltrue:
        if ang < goaltrue:
            ang = ang + moveNum
        if ang > goaltrue:
            ang = ang - moveNum
        done = False
    if (ang + moveNum) > goaltrue and (ang - moveNum) < goaltrue:
        ang = goaltrue

moveNum = 1

for i in range(0, 5):
    tempsurf.blit(f2, (0,-30))
    showshit()
    pygame.time.delay(500)
    tempsurf.blit(f1, (0,-30))
    showshit()
    pygame.time.delay(500)

tempsurf.blit(f2, (0,-30))
showshit()
pygame.time.delay(200)


tempsurf.blit(splash, (0,0))
showshit()
pygame.time.delay(3000)

for i in range(0,2):
    tempsurf.fill((0,0,0))
    tempsurf.blit(f5, (0, -30))
    showshit()
    pygame.time.delay(500)
    tempsurf.blit(f4, (0, -30))
    showshit()
    pygame.time.delay(500)

tempsurf.blit(f5, (0, -30))
showshit()
pygame.time.delay(400)
f2 = None
f5 = None
f4 = None
f1 = None
f3 = None
tempsurf.blit(f6, (0, 0))
showshit()
f6 = None
pygame.time.delay(2000)
tempsurf.blit(f7, (0,0))
showshit()
f7 = None
pygame.time.delay(2000)
tempsurf.blit(f8, (0,0))
showshit()
pygame.time.delay(3000)
tempsurf.blit(f9, (0,0))
showshit()
f9 = None
pygame.time.delay(100)
tempsurf.blit(f10, (0,0))
showshit()
f10 = None
pygame.time.delay(2500)
tempsurf.blit(f11, (0,0))
showshit()
f11 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f12, (0,0))
showshit()
f12 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f13, (0,0))
showshit()
f13 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(K4, (0,0))
showshit()
K4 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f14, (0,0))
showshit()
f14 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f15, (0,0))
showshit()
f15 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(K7, (0,0))
showshit()
K7 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f16, (0,0))
showshit()
f16 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f17, (0,0))
showshit()
f17 = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(KS, (0,0))
showshit()
KS = None
pygame.time.delay((random.randint(100,700)))
tempsurf.blit(f18, (0,0))
showshit()
f18 = None
pygame.time.delay(800)
tempsurf.blit(f8, (0,0))
showshit()
f8 = None
pygame.time.delay(2700)
tempsurf.blit(background, (0,0))
showshit()
pygame.time.delay(1500)

#tempsurf.blit(textlayer, (0,0))
tempsurf.blit(window, (6,0))
showshit()
pygame.time.delay(500)
tempsurf.blit(window, (245,0))
showshit()
pygame.time.delay(300)
tempsurf.blit(window,(484,0))
showshit()
pygame.time.delay(400)
tempsurf.blit(window, (6,240))
tempsurf.blit(task, (0, 460))
showshit()
pygame.time.delay(600)
tempsurf.blit(window, (245, 240))
tempsurf.blit(task, (0, 460))
showshit()
pygame.time.delay(300)
tempsurf.blit(window, (484, 240))
tempsurf.blit(task, (0, 460))
showshit()
pygame.time.delay(400)
tempsurf.blit(textlayer, (0,0))
showshit()
pygame.time.delay(2000)



#       top row of gauges
tempsurf.blit(gauge, (30, 30))
tempsurf.blit(gauge, (270, 30))
tempsurf.blit(gauge, (510, 30))

#       bottom row of gauges
tempsurf.blit(gauge, (30, 270))
tempsurf.blit(gauge, (270, 270))
tempsurf.blit(gauge, (510, 270))
window = None
gauge = None
task = None

showshit()

#def threadfunc():
    #global extGoal
    #while True:
        #drawNeedle(extGoal, (117.5, 117.5))
        #drawNeedle(extGoal, (357.5, 117.5))
        #drawNeedle(extGoal, (597.5, 117.5))

        #drawNeedle(extGoal, (117.5, 357.5))
        #drawNeedle(extGoal, (357.5, 357.5))
        #drawNeedle(extGoal, (597.5, 357.5))


moveNum = moveNumOrg
tempsurf.blit(background, (0,0))
tempsurf.blit(textlayer, (0,0))
background = None
textlayer = None
ang = zeroDeg
#x = threading.Thread(target=threadfunc)
#x.start()
while 1:

    # Did the user click the window close butt           running = False

    #starttime= time.time()
    #farloop()
    #print("farloop --- %s seconds ---" % (time.time() - starttime))
    #starttime = time.time()
    #extGoal = goals()
    #print("get goal --- %s seconds ---" % (time.time() - starttime))

    if ang == zeroDeg:
        extGoal=270
    if ang == maxDeg:
        extGoal=0

    tempsurf.blit(mainback, (0,0))

    drawNeedle(extGoal, (117.5, 117.5))
    drawNeedle(extGoal, (357.5, 117.5))
    drawNeedle(extGoal, (597.5, 117.5))

    drawNeedle(extGoal, (117.5, 357.5))
    drawNeedle(extGoal, (357.5, 357.5))
    drawNeedle(extGoal, (597.5, 357.5))
    showshit()

pygame.quit()

标签: pythonpython-3.xpygameraspberry-pi

解决方案


pygame.transform.rotate()不操纵原始图像。因此,无需复制原始图像:

image = pygame.transform.rotate(im.copy(), angle)

def rotate(im, angle, pivot):
    # rotate the leg image around the pivot
    image = pygame.transform.rotate(im, angle)
    rect = image.get_rect(center = pivot)
    return image, rect

needle2, pos2 = rotate(needleOrd.copy(), ang, pos)

def drawNeedle(goal, pos):
    global firstRun, ang, done, moveNum
    if firstRun:
        ang = zeroDeg
    firstRun = False
    needle2, pos2 = rotate(needleOrd, ang, pos)

    # [...]

推荐阅读