2016-07-16 42 views
0

我知道類似這樣的東西以前已經問過,但我找不到一個答案超越「不要一次重畫整個屏幕」,這實際上不是一個滾動的選項2D射擊遊戲,即使沒有必要時我沒有更新整個屏幕,玩家也不會注意到幀速率,除非您無論如何都移動了,這就是當整個屏幕需要重繪時...Pygame/SDL低幀率在高清

因此如何渲染遊戲,整個遊戲被繪製到480 * 270表面(renderLayer)上,然後在翻轉顯示之前將其渲染到渲染函數結束時的屏幕尺寸。

在480 * 270窗口中運行遊戲會產生數百個幀率,但只要遊戲以1080p運行,我很幸運能夠獲得45至60fps的幀率。請記住,整個代碼中唯一改變的部分是在每個更新幀的末尾放大,然後將緩衝區翻轉到屏幕上,所以其餘代碼與此性能下降無關。

顯示被初始化像這樣:

os.environ['SDL_VIDEODRIVER'] = 'windib' 
pygame.init() 
display = pygame.display.set_mode((0,0),FULLSCREEN|DOUBLEBUF|HWSURFACE) 

我用windib,因爲它產生了非常稍高幀率比默認的驅動程序。

而渲染結束後,所有的對象都已經blit到renderLayer上。

display.blit(pygame.transform.scale(renderLayer,display.get_size()),(0,0)) 
pygame.display.flip() 
clock.tick() 
print(clock.get_fps()) 

記住我通常使用clock.tick(60),因爲它是在適當的速度藏在心裏,尤其是在多人,其中同步化是非常重要的是有用的,但對於幀率測試中,我把它作爲剛剛時鐘。 tick(),這樣我就可以準確表示性能變化。

那麼有誰知道是否有一種方法可以在更高的分辨率下增加幀率或擴展到顯示器的其他方法?我聽說過使用openGL作爲顯示器,但從實驗中我可以看出,從標準pygame表面不再可能對這些表面進行blitting。

對不起,如果代碼發佈很短,但與2000+代碼遊戲我不想浪費每個人的時間與代碼,沒有差別幀率之間的低分辨率和高分辨率(顯示器是在整個遊戲循環的其餘功能中都沒有被引用或使用 - 所有東西都使用renderLayer來實際繪製幀)。

非常感謝任何給予他們時間閱讀和/或回答我的查詢的人,並且我也非常抱歉,如果這對於本網站來說太具體。我不知道還有什麼要問的。

回答

0

只在啓動時擴展您的資產。你的邏輯可以保持默認的分辨率,但是在blitting時做偏移量的計算。這樣你就不會縮放每一幀。

關於pygame和性能的一個注意事項: pygame,又名sdl1使用軟件渲染。這意味着您的GPU不用於完成繁重的工作。如果你想研究python,那麼存在python的sdl2端口。