2012-07-05 29 views
2

我正在寫一個簡單的程序在Python中,它通過串口接收數據並更新屏幕。因爲我希望這個程序在運行的任何一臺計算機上看起來都是一樣的,而且它需要全屏顯示,所以我想到我想在一個小窗口中繪製所有內容,然後縮放它在每次更新幀時都會顯示爲全屏窗口。pygame(Python)縮放變換緩慢

這使我可以保持文本等所有偏移量相同。它也證明這非常慢。

下面是關於什麼的代碼的重要組成部分,看起來像:

window = pygame.display.set_mode((1920, 1080),pygame.FULLSCREEN)  
screenPrescaled=pygame.Surface((640,480)) 

clock=pygame.time.Clock() 


while iterations<400: 
#Blit all the stuff to the prescaled surface here 
    screenPostscaled=pygame.transform.scale(screenPrescaled,(1920, 1080)) 
    window.blit(screenPostscaled,(0,0)) 
    pygame.display.flip() 
    iterations+=1 
    clock.tick(40) 

這個運行的比40fps慢了一大堆。

屏幕上的所有內容都是文字或線條,沒有加載圖像。 我懷疑我正在做一些愚蠢的事情。

我知道我可以更新「骯髒的長方形」只,但我不知道我是否失去了更基本的東西。

在此先感謝!

+0

縮放比較慢,所以你不需要每一個循環。另外,你可以定義屏幕百分比的偏移量,就像在OpenGl中一樣。無論分辨率如何,SVG圖形都會縮放。 – ninMonkey 2012-11-29 03:32:46

回答

3

可以使用窗口中保存一個塊傳輸的destination surface

pygame.transform.scale(screenPrescaled, (1920, 1080), window) 

如果仍然太慢,你應該使用更新的矩形,你可以使用相同的係數調整他們爲你縮放圖像1920/640和1080/480。

+1

謝謝!去掉那個blit並使用一個轉換目的地確實會加快速度。我將代碼定爲40fps,這非常棒。 – Narrat1ve 2012-07-05 19:23:08

1

您正在更新一個大屏幕display.flip()。在SDL中(這是pygame的背後),這不是一個好主意(嘗試刪除所有的東西,看看它的運行速度有多快,但速度應該不會太快)。

我沒有辦法測量,但我猜你的代碼需要很長時間的原因是.flip()的問題。

由於您只使用640x480的數據,爲什麼要將它擴展到如此巨大的尺寸?嘗試將您的屏幕設置爲640x480,然後查看當時的速度。我認爲它應該快四到五倍。

+0

謝謝!這個想法是具有已知尺寸的表面,所以我可以將文字等放在我想要的地方。然後,我將其縮放到全屏大小(對於不同的機器,這將會有所不同)。一切都按比例縮放。你說得對,它在640x480上的運行速度要快得多,但最終不會那麼小。 – Narrat1ve 2012-07-05 17:34:34

+0

@ Narrat1ve可能是你在SDL/pygame中輸了。我知道無法更快地製作出這樣的大型文件/更新。但是,我從來沒有嘗試覆蓋(視頻),OpenGL的pygame或其他加速方法。也許你可能想看看他們。 – kratenko 2012-07-05 17:39:02

2

最簡單的事情是不是使用

pygame.display.flip() 

是使用

pygame.display.update() 

這不是多大區別,但它工作得很好,我對我的比賽,尤其是當它使用很多照片。