7

我在网上看到了HWSURFACE|DOUBLEBUF|RESIZABLE调整窗口大小的方法。

HWSURFACE它有效,但我不确定DOUBLEBUF实际做什么。

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

4

2 回答 2

12

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

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

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

希望有帮助

于 2015-03-19T01:48:42.190 回答
0

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

“如果您的显示模式使用标志 pygame.HWSURFACE 和 pygame.DOUBLEBUF,这将等待垂直回溯并交换表面。”

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

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

于 2021-09-29T10:03:33.717 回答