代码之家  ›  专栏  ›  技术社区  ›  Johan

TextureFilters(MipMap生成)如何影响性能?

  •  1
  • Johan  · 技术社区  · 6 年前

    我一直在读到,选择纹理过滤器(特别是MipMap生成)可能会对应用程序的性能产生影响,但我真的不知道它是如何工作的。所以有几个问题:

    1. MipMaps是每帧生成还是仅在加载纹理时生成一次?
    2. 如果每个帧都是静态的(纹理大小和位置不变),那么从一帧到另一帧的场景是否仍会重新生成。比如,如果您有一个静态UI,那么在使用MipMap过滤时,它的性能会更差吗?
    3. 如果只有一次,为什么它会影响性能,以什么方式影响性能?

    我很好奇,因为我发现使用(在LibGDX中)时,一切看起来都好多了:

    param.genMipMaps = true;
    param.minFilter = TextureFilter.MipMapLinearLinear;
    param.magFilter = TextureFilter.Linear;
    

    但为什么这不是标准/最佳实践?缺点是什么?如果对于我的应用程序,它没有减少fps,那么还有其他缺点吗?更多GPU/CPU密集型?电池消耗更高(移动设备)?

    1 回复  |  直到 6 年前
        1
  •  2
  •   BDL Vyxzl    6 年前

    每当纹理数据发生变化时,都必须生成mipmap。只要纹理不变,也就不需要重新创建它们。

    它们会影响性能,因为每个texel的读取操作都会变慢。根据您使用的过滤器类型,GPU必须从多个mipmap级别读取多个纹理以计算最终颜色。

    例如 GL_NEAREST 将只读取1个texel并返回该texel。 GL_LINEAR 将必须从一个mipmap级别读取4个texel并执行双线性插值。如果现在启用mipmapping,那么来自第二个纹理级别的信息也会影响结果。具有 GL_LINEAR_MIPMAP_LINEAR ,GPU将在大于所需大小的mipmap级别中执行线性查找(4 texel),并在小于所请求大小的mipmap级别中执行一个线性查找。然后对这两次查找的结果进行插值以获得最终颜色。总之,a GL_LINEAR_MIPMAL_LINEAR 查找可能读取8个texel,并在两个级别之间执行2个双线性插值和一个线性插值( trilinear interpolation )。

    另一个考虑因素是GPU内存消耗。Mipmaps需要存储在gpu上的某个位置,与没有Mipmaps的情况相比,需要占用大约1/3的空间。

    有关Mipmapping的更多详细信息,还应阅读 Wikipedia Article 这很好地解释了这个概念。正如其他人在评论中所述 blog 提供有关纹理过滤方法的良好概述。

    请注意,此处的解释假设为二维纹理。另请注意, 图形卡可以很好地优化这个过程,但描述的技术是它在理论上的工作原理。