共计 1248 个字符,预计需要花费 4 分钟才能阅读完成。
Android GPU Inspector (AGI) 可能帮忙咱们洞悉 Android 设施上的 GPU 外部运行状况。对 GPU 来说,最具挑战性的工作之一就是在着色器中获取和过滤纹理数据。通过采集 带宽 、 缓存行为 、 滤镜渲染 三个方面的数据,咱们就能够应用 AGI 监督与纹理相干的 GPU 工作负载。
我经常从察看纹理带宽动手,因为它表明了每帧画面中有多少纹理数据输出到了 GPU,进而能够疾速定位潜在的性能问题。
就纹理带宽来说,一个很好的教训法令就是确保 纹理读取带宽 (Texture Read Bandwidth) 均值不高于 1GB/s,而峰值远低于 5GB/s。
比方这个游戏,它就耗费了大量的纹理带宽,因为均匀带宽达到了 4GB/s,而到了帧结尾的局部,峰值已超过 6GB/s。
后续渲染步骤 (Post Processing steps) 对纹理带宽需要较高是能够了解的,兴许您能够在渲染的后序阶段把局部带宽应用于一些非凡的成果解决下面,比方实现光晕和色调映射。然而如果您的游戏存在很高的纹理读取带宽峰值,那么就须要留神潜在的性能问题了。
对于这个游戏来说,纹理带宽的耗费十分高,须要进一步剖析。
要剖析潜在的纹理带宽问题,首先我会查看纹理缓存状况。我的关注点在于纹理的停滞比例,L1 和 L2 缓存未命中的比例。当 L1 缓存未命中所需的纹理数据时,申请会转向 L2 缓存,而后会再转向零碎内存。每一步都会减少提早并且进步功耗。L1 的均匀未命中比例不应该超过 10%,未命中的峰值比例不应该超过 50%。
这个游戏在 GPU 零碎的数据采集显示 L1 缓存的均匀未命中比例超过了 20%,而峰值曾经达到 80% 甚至更高。
可见这些数据确实十分高了。
对于纹理停滞比例较高的典型起因是纹理未压缩、简单的过滤操作 (如非等向性过滤),以及纹理未经 mipmap 解决。
为了剖析造成纹理缓存未命中的潜在起因,我会察看非等向性过滤 (anisotropic filtering) 的纹理获取比例 (属于挪动终端上的耗时操作) 和非根底级别纹理 (Non Base Level) 的获取比例。
获取非根底级别纹理的比例是对 mipmap 纹理获取效率的初略预计。当该数字为 0 时,它意味着 GPU 经常拜访最顶级的 mipmap 纹理数据,也就是纹理的 mipmap 链中最大的一片或者未进行 mipmap 解决的纹理。
尽管在 2D 游戏中基本上能够承受这样的解决,然而在 3D 游戏中,这就算是问题了。
当渲染 GUI 或者 PostProcessing 期间拜访未经 mipmap 解决的纹理是能够的。然而在其它场景下,这样的操作会带来很大的性能损失,也是导致较差数据缓存成果的起因。
事实上,获取纹理会耗费大量的零碎带宽,同时可能会造成提早、电池寿命缩短,甚至引起过热问题进而导致进一步的性能降落。剖析纹理行为相干的 GPU 计数数据并解决所发现的问题,可能更轻易、更大幅度地晋升用户体验。
要发现该类型和纹理相干的 GPU 性能问题,能够应用 Android GPU Inspector 采样您的游戏数据,而后根据这里为大家介绍的内容比拟剖析 GPU 计数器的数据和变化趋势。