【问题标题】:What do HWSURFACE and DOUBLEBUF do?HWSURFACE 和 DOUBLEBUF 是做什么的?
【发布时间】:2015-05-22 00:14:18
【问题描述】:

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

它可以工作,但我不确定HWSURFACEDOUBLEBUF 实际做了什么。

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

【问题讨论】:

    标签: python pygame double-buffering


    【解决方案1】:

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

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

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

    希望有帮助

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-09
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多