【问题标题】:Is glClear(GL_COLOR_BUFFER_BIT) preferred before a whole frame buffer overwritten?在覆盖整个帧缓冲区之前首选 glClear(GL_COLOR_BUFFER_BIT) 吗?
【发布时间】:2016-05-21 20:53:23
【问题描述】:

我看到了不同的意见。 目前,我只关心颜色数据。

Chapter 28. Graphics Pipeline Performance 中,它说:

避免多余的颜色缓冲区清除。如果每个像素都保证 被您的应用程序覆盖在帧缓冲区中,然后避免 清除颜色,因为它会消耗宝贵的带宽。

How does glClear() improve performance?中,引用自Apple's Technical Q&A on addressing flickering (QA1650)

您必须为屏幕上的每个像素提供一种颜色。在 在绘图代码的开头,最好使用 glClear() 初始化颜色缓冲区。全屏清除您的每一个 开始时的颜色、深度和模板缓冲区(如果您正在使用它们) 帧的帧数通常也可以提高您的应用程序的性能。

在那篇文章中有一个答案:

通过发出 glClear 命令,您是在告诉硬件您这样做了 不需要以前的缓冲区内容,因此不需要复制 颜色/深度/从帧缓冲区到较小的图块内存。

对于这个答案,我的问题是: 如果没有混合,为什么我们需要从帧缓冲区中读取颜色数据。 (目前,我只关心颜色数据)

但无论如何,一般来说,我是否需要调用 glClear(GL_COLOR_BUFFER_BIT)

【问题讨论】:

    标签: opengl


    【解决方案1】:

    在第 28 章。图形管道性能中,它说:

    有很多不同种类的硬件。在印刷 GPU Gems #1 时流行的硬件上,这个建议是合理的。现在已经没有了。

    曾几何时,清除缓冲区实际上意味着硬件会转到每个像素并写入清除值。这个过程显然花费了大量的 GPU 时间,因此高性能应用程序开发人员竭尽全力 avoid incurring the wrath of the clear operation

    如今(我指的是至少在过去 8 到 10 年制造的几乎所有 GPU),图形芯片在清除方面更加智能。他们没有进行清除,而是使用帧缓冲区的缓存玩游戏。

    在执行读/修改/写操作时,帧缓冲区图像的值被清除。这包括混合等,但也包括任何形式的深度或模板测试。为了执行 RMF 操作,您必须首先读取那里的值。

    这就是聪明之处所在。当您“清除”帧缓冲区图像时,什么都不会被写入。相反,帧缓冲区图像地址空间无效。当对无效地址进行读取操作时,它只返回清除值。这需要零带宽。实际上,它节省了带宽,因为读取操作实际上不必读取内存。它只是获取一个明确的值。

    根据缓存的工作方式,在执行纯写操作时甚至可能更快。但这取决于不同的硬件。

    对于使用基于图块渲染的移动硬件,这一点更为重要。在瓦片可以开始处理之前,它必须读取帧缓冲区图像的当前值。如果图像被清除,则不需要读取任何内容;它只是将磁贴内存设置为清晰的颜色。

    即使您没有混合到帧缓冲区,这种情况也很重要。为什么?因为 GPU 和 API知道你不会混合。它只知道你要对该图像执行一些渲染操作。所以它必须假设最坏的情况并将图像读入图块中。当然,除非你事先清除它。

    简而言之,当将这些图像用于帧缓冲区时,首先清除图像通常不会比不清除图像慢

    以上都假设您清除了整个图像。如果您只清除图像的一个子区域,那么这种优化不太可能发生。尽管它仍然是可能的,至少对于基于缓存行为的优化而言。

    【讨论】:

    • 非常感谢!我的问题是:如果没有混合,为什么我们需要从帧缓冲区中读取颜色数据。 (目前,我只关心颜色数据。我正在研究 2D 图像处理)。如果我们不需要读取数据,为什么还需要 glClear?
    • @user1914692:我从来没有说过你需要清除任何东西。我说过它可以提高性能,具体取决于硬件。
    • 然后 Gem 所说的“如果您的应用程序保证帧缓冲区中的每个像素都被覆盖,那么请避免清除颜色,因为它会消耗宝贵的带宽。”仍然有效,对吧?而苹果所说的“在你的绘图代码的开头,使用 glClear() 来初始化颜色缓冲区是个好主意。”条件不好,对吧?
    • @user1914692:不。这实际上与我所说的完全相反。我非常清楚地解释了如何清除不消耗带宽。我解释了各种硬件是如何实现这一点的。我什至解释了它如何适用于基于 tile 的架构,以及为什么它对它们更重要。我不知道您是如何阅读我的帖子并得出与我所说的相反的结论的。
    • 它可能不会花费带宽,但它仍然是一个命令。如果根本没有用,那将花费非常少(无论多么小)的时间。
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多