Pygame/SDL 低帧率高清



我知道以前有人问过类似的东西,但我找不到答案,除了"不要一次重绘整个屏幕"之外,这真的不是滚动 2D 射击游戏的选择,即使我不在不必要的时候更新整个屏幕,玩家也不会注意到帧率,除非你无论如何都要移动,这是整个屏幕需要重绘的时候......

至于游戏的

渲染方式,整个游戏被绘制到一个 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,是因为它产生的帧速率比默认驱动程序略高。

渲染

结束,在所有对象都已布莱特到渲染层之后。

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

请记住,我通常使用 clock.tick(60),因为它对于保持所有内容以正确的速度很有用,尤其是在同步很重要的多人游戏中,但对于帧率测试,我将其保留为 clock.tick(),这样我就可以准确地表示性能变化。

那么有谁知道是否有办法在更高分辨率下提高帧速率或其他放大到显示器的方法?我听说过将openGL用于显示器,但是从标准的pygame表面,从我在实验中可以看出,不再可能从标准pygame表面到这些表面。

抱歉,如果发布的代码很短,但是对于 2000+ 行代码游戏,我不想浪费每个人的时间在对低分辨率和高分辨率之间的帧速率没有影响的代码上(在游戏循环中的其余函数中根本不引用或使用显示 - 一切都使用 renderLayer 来实际绘制帧)。

提前感谢任何花时间阅读和/或回答我的查询的人,如果这对本网站来说是一个太具体的问题,我也深表歉意。我不知道还能问哪里。

仅在启动时扩展一次资产。您的逻辑可以保持默认分辨率,但在块传输时对偏移量进行数学运算。这样,您就不会缩放每一帧。

关于pygame和性能的旁注:Pygame,又名SDL1使用软件渲染。这意味着您的GPU不用于完成繁重的工作。如果你想研究一下,有 python 的 sdl2 端口。

最新更新