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

时间:2018-03-02 09:40:16

标签: opengl libgdx textures gpuimage

我一直在阅读选择纹理过滤器(特别是MipMap生成)可能会对应用程序的性能产生影响,但我无法真正了解它的工作原理。所以有几个问题:

  1. MipMaps是每帧生成还是仅在加载纹理时生成一次?
  2. 如果每一帧,如果场景从一帧到另一帧是静态的(纹理大小和位置是恒定的),它是否仍会重新生成。就像你有一个静态UI一样,在使用MipMap过滤时表现更差吗?
  3. 如果只有一次,为什么会影响性能,以什么方式影响?
  4. 我想知道,因为我发现使用时(在LibGDX中)一切看起来好多了:

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

    但为什么不是这个标准/最佳做法?有什么缺点?如果,对于我的应用程序,它不会降低fps,还有其他任何缺点吗?更多GPU / CPU密集型?更高的电池消耗(对于移动设备)?

1 个答案:

答案 0 :(得分:2)

每当纹理数据发生变化时,都必须生成Mipmap。只要纹理没有改变,就没有必要重新创建它们。

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

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

另一个考虑因素是GPU内存消耗。 Mipmap需要存储在gpu的某个地方,占用的空间比没有mipmap的空间多1/3。

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

请注意,此处的解释假定为二维纹理。还要注意,  图形卡可以很好地优化过程,但所描述的技术在理论上是如何工作的。