【问题标题】:How does TextureFilters (MipMap generation) affect performance?TextureFilters(MipMap 生成)如何影响性能?
【发布时间】:2018-03-02 09:40:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我会阅读这篇文章gamedevelopment.blog/texture-filter,它解释了纹理过滤的工作原理,解释了每个过滤器的作用,并向您展示了生成的示例图像,应该回答您的所有问题。

标签: opengl libgdx textures gpuimage


【解决方案1】:

只要纹理数据发生变化,就必须生成 Mipmap。只要纹理不改变,也不需要重新创建它们。

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

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

另一个考虑因素是 GPU 内存消耗。 Mipmap 需要存储在 gpu 上的某个位置,并且比没有 mipmap 占用大约多 1/3 的空间。

有关 Mipmapping 的更多详细信息,还应阅读Wikipedia Article,它很好地解释了这一概念。正如 cmets 中的其他人所述,blog 也很好地概述了纹理过滤方法。

注意,这里的解释假设是二维纹理。另请注意, 显卡可以很好地优化这个过程,但所描述的技术是它在理论上是如何工作的。

【讨论】:

  • Mip 贴图理论上也可以提高严重最小化纹理的渲染性能,因为着色器中的提取操作不必从尽可能大的图像中提取。
  • 所以如果我理解正确的话,这涉及到两个性能成本: 1. 生成 MipMap 的成本仅在启动游戏/创建纹理或更改实际纹理图像时发生。 2. 屏幕上每个像素的渲染成本取决于选择的过滤器,这会影响应考虑多少纹理像素以及将执行多少线性插值 -> 更多计算。数字 2 发生在每一帧,可能是最需要考虑的一个?
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多