【发布时间】:2021-10-07 00:29:31
【问题描述】:
我正在尝试在我的汽车屏幕上制作一组仪表。 该程序在 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()
【问题讨论】:
-
当每个人想要加速代码时,都应该做同样的事情:分析它。这将告诉您大部分时间都花在了哪些地方,以及您应该将注意力集中在代码的哪些部分。就像使用
time.time()和print()一样简单。 -
也许你应该减少一些操作。您真的必须在每个
blit()中使用scale()- 也许您应该只缩放所有元素一次,然后再使用这些元素。我不知道你是否必须.copy()rotate()-rotate提供新图像并且它不会改变旧图像。 -
你真的需要这么多图片吗?也许您可以在一个表面上 blit 一些图像,然后只在这个单一表面上 blit。顺便说一句:也许您应该将元素保留在列表中,而不是使用
f1, f2, etc.,然后您可以使用for-loop - 它可以使代码更短且更具可读性。 -
感谢大家的帮助,我从没想过这些,它应该有很大帮助!非常感谢
标签: python python-3.x pygame raspberry-pi