【问题标题】:Pygame/SDL Low Framerate at HDPygame/SDL 高清低帧率
【发布时间】:2016-11-19 13:00:57
【问题描述】:

我知道以前有人问过类似的问题,但除了“不要一次重绘整个屏幕”之外我找不到答案,这对于滚动 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,因为它产生的帧速率比默认驱动程序略高。

渲染结束,在所有对象都被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),因为它对于保持一切都在正确的速度很有用,尤其是在同步很重要的多人游戏中,但对于帧率测试,我将其保留为 clock.tick() 所以我可以获得性能变化的准确表示。

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

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

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

【问题讨论】:

    标签: python performance pygame sdl frame-rate


    【解决方案1】:

    仅在启动时扩展您的资产一次。您的逻辑可以保持默认分辨率,但在 blitting 时计算偏移量。这样您就不会缩放每一帧。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2019-11-20
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多