2016-07-16 54 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端口。