python - 如何在树莓派上加速 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()
解决方案
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)
# [...]
推荐阅读
- php - 打开服务器致命错误内存不足
- ios - 领域是否支持 iOS 中的 LIMIT 查询?
- laravel - 如何强制一个独特的规则忽略给定的 id?
- android - 在 Android 复合视图中不接受来自 xml 的 onclick
- angularjs - 将带有 ng-model 的复选框添加到 Object AngularJS
- php - 如何从 htdocs 或 xampp 文件夹之外的 cmd 启动任何项目?
- java - 仅当我的 @Test 通过时才运行 @AfterMethod,而不是在 @Test 失败时运行
- spring - 访问被拒绝(用户是匿名的);重定向到身份验证入口点
- logstash-grok - 可选字段的 GROK 模式
- asp.net - 将文件复制到远程服务器会导致配置错误?