HWSURFACE 和 DOUBLEBUF 有什么作用?

What do HWSURFACE and DOUBLEBUF do?

我在网上看到使用 HWSURFACE|DOUBLEBUF|RESIZABLE 来调整 window 的大小。

它有效,但我不确定 HWSURFACEDOUBLEBUF 的实际作用。

我知道它代表硬件表面和双缓冲区,但我不知道它们实际上有什么帮助。

令我失望的是 pygame 文档(例如 http://www.pygame.org/docs/ref/display.html)似乎没有像我认为的那样解释这一点。

双缓冲,正如标签描述中提到的那样,使用单独的内存块来应用所有绘图例程,然后将该块(缓冲区)作为单个操作复制到视频内存。如果不这样做可能会导致图形伪影。一个简单的例子可能是场景的闪烁,这是由于在视频刷新之前绘制了背景的一部分,然后在刷新之后绘制了其他部分(因此它们直到下一次刷新才显示)。

硬件表面是指使用视频卡上的内存 ("hardware") 来存储抽奖,而不是主内存 ("software")。这样做的主要原因是主内存和显存之间的带宽往往很慢,因此能够直接绘制可以加快速度。 SDL(PyGame 建立在其之上)最初开发用于支持不支持硬件表面的旧视频卡,因此您必须请求额外的功能以查看您的硬件是否可以利用它们。在这个时间点,我的理解是几乎任何视频卡(即使是在过去几年内制造的低端笔记本电脑上的板载视频卡)(甚至像 Raspberry Pi 这样的东西,但我需要检查它) 应该支持 DOUBLEBUF 和 HWSURFACE。您可能需要查看 SDL 文档以查看是否提供了您需要的任何其他详细信息

希望对您有所帮助

来自 pygame 文档 pygame.display.flip():

"if your display mode is using the flags pygame.HWSURFACE and pygame.DOUBLEBUF, this will wait for a vertical retrace and swap the surfaces."

这意味着绘制表面和精灵,即。复制或 blited 到当前未显示的另一个显存区域。在垂直回扫处,即。当上一帧绘制完毕,下一帧还没有开始绘制时,将指向下一个要显示的显存区域地址的指针更改为绘制精灵的区域,即双缓冲区。这具有交换屏幕效果,并且比复制整个图像快得多。 这也避免了 screen tearing,即。上一帧的一部分与下一帧的一部分一起绘制,因为在硬件未更新显示时交换到双缓冲区。

有时,当使用固定表面作为背景时,pygame.display.update() 会更快,因为只有在帧之间移动的精灵区域会更新。