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

问题描述 投票:1回答:1

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

  1. MipMaps是每帧生成还是仅在加载纹理时生成一次?
  2. 如果每个帧,如果场景从一帧到另一帧是静态的(纹理大小和位置是恒定的),它是否仍然会重新生成。就像你有静态用户界面一样,在使用MipMap过滤时表现更差吗?
  3. 如果只有一次,为什么它会影响性能,以什么方式?

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

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

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

opengl libgdx textures gpuimage
1个回答
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也对纹理过滤方法给出了很好的概述。

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

© www.soinside.com 2019 - 2024. All rights reserved.