【问题标题】:How to reduce MSAA memory usage?如何减少 MSAA 内存使用量?
【发布时间】:2021-12-12 16:07:15
【问题描述】:

这里正在使用 OpenGL ES 在 iOS 上进行渲染。为了获得更好的图像质量,我们采用MSAA,即。多重采样抗锯齿,使用 4 倍大的 FBO。

例如,在 1080P 分辨率下,单个渲染目标纹理使用 1080 * 1920 * 4 * 4 = 33 MB

有什么方法可以减少吗?

【问题讨论】:

  • MSAA 并不一定意味着 FBO 大 4 倍。这取决于样本的数量。所以它基本上是正常 FBO 的大小乘以样本数:link

标签: ios memory-management opengl-es antialiasing


【解决方案1】:

在使用 OpenGL 进行渲染时,无法避免这种分配。如果您可以选择使用 Metal,则可以使用无记忆渲染目标,假设您需要做的只是在渲染后立即解析 msaa 缓冲区。

【讨论】:

    【解决方案2】:

    例如,在 1080P 分辨率下,单个渲染目标纹理使用 1080 * 1920 * 4 * 4 = 33 MB。

    你确定吗?在桌面 GPU 上我会说你是对的,但 iOS GPU 是基于 Tile 的延迟渲染器。内存带宽使用非常耗电,因此在移动 GPU 上使用不同的方法来节省带宽。基于 Tile 的渲染器将屏幕的片段着色拆分为例如32x32 瓦片,这样它们就不会不断地读取和写入帧缓冲区。

    这样的架构可以非常有效地实现 MSAA。额外的样本不需要作为分配的内存存在,它们可以暂时存在于图块内存中,并且图像在仍然在图块内存中时被解析,因此只需将解析的像素写入帧缓冲区。 MSAA 缓冲区不需要存在。

    例如请参阅 PowerVR 的这句话(iOS GPU 最初基于 PowerVR,尽管该技术最近出现了分歧)https://docs.imgtec.com/Profiling_and_Optimisations/PerfRec/topics/c_PerfRec_msaa_performance.html

    在 PowerVR 硬件上,多采样抗锯齿 (MSAA) 可以直接在片上内存中执行,然后再写入系统内存,从而节省宝贵的内存带宽

    如果在 iOS 上使用 MSAA 会消耗您的内存,那么这可能是因为驱动程序编写得不好,或者是因为某些不寻常的用法阻止了驱动程序对其进行优化。也就是说,GLES 在 iOS 上已经被弃用了很长时间,所以驱动程序可能不是很好。

    【讨论】:

    • 我已经在 iphone 8plus 和 ios 14.3 上测试了 GLES 模式,它是。看来我应该改用金属来解决这个问题。
    【解决方案3】:

    这里有一些选项。

    减少 MSAA 的样本数量:例如,您可以只使用两个样本。

    使用其他抗锯齿/多重采样技术。

    • Nvidia 的 DLSS:使用 AI 升级图像。但仅适用于 Nvidia GPU。
    • AMD 的 FSR。开源并且可以在任何平台上运行(我读过你可以将它与 MSAA 和其他技术结合使用)。 https://github.com/GPUOpen-Effects/FidelityFX-FSR

    我发现了一些不同技术的概述:https://www.geeksforgeeks.org/types-of-antialiasing-techniques/

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 2015-01-10
      相关资源
      最近更新 更多