3.7.1 当前移动端GPU概况
安卓市场CPU占比
总体分析,高通占比49.2%,相比于其他厂商有较大优势,其次是华为28.6%,联发科
安卓GPU占比
GPU中,高通Adreno与Mali的市场分别为49.2%和48.2%,而PowerVR-GPU在安卓中使用较少,占比仅有2.6%
各类电子设备功耗对比
- 桌面:300w
- 游戏主机:150-200w
- 游戏本:100w
- 主流游戏本:50-60w
- 超极本:15-25w
- 旗舰平板:8-15w
- 旗舰手机:5-8w,主流手机:3-5w
粗略估计,桌面端和移动端的功耗差距达到100倍。
桌面和移动端带宽比较
名词解释
- soc system on chip,集成了CPU,GPU等等
- System Memory,soc中GPU和CPU共用一块片内LPDDR物理内存,一般大小为几个G。
- 除此之外,两者还有各自独立的告诉SRAM叫做Cache缓存,也就On-chip Memory,大小为几百k到几M不等。读取on-chip memory的速度比读取system memory的速度要快非常多。
- 其中,on-chip memory在TB(D)R架构下会存储Tile的颜色、深度和模板缓冲,使得加快读写和修改速度。
- Stall:当一个GPU核心的两次计算结果之间有依赖关系而必须串行时,等待的过程就叫做Stall。
- FillRate:像素填充率 = ROP运行的时钟频率 x ROP的个数 x 每个始终ROP可以处理的像素个数。
3.7.2 IMR
桌面端的渲染模式
Immediate mode rendering
直接和系统内存进行交互
3.7.3 TBDR
Tile-Based Defered Rendering
TB(D)R简单的意思: 屏幕被分块渲染
TBR:VS - defer - RS - PS
TBDR : VS - Defer - RS - Defer - PS
Defer: 字面意思延迟,从渲染数据的角度来看,defer就是 “阻塞 + 批处理”GPU的 “一帧”的多个数据,然后一起处理。
TBDR
- 第一阶段执行所有与几何相关的处理,并生成Primitive List(图元列表),并且确定每个tile上有哪些primitive;
- 第二阶段将逐块执行光栅化及后续处理,并在完成后将Frame Buffer从Tile Buffer 写回到System Memory中。
TBR与IMR的区别:
3.7.4 TBR示意图
渲染过程示意图:
实际中GPU硬件中的乱序执行:
3.7.5 TBR优缺点
优点:
- TBR给消除Overdraw提供机会,HSR技术(PowerVR)和 Forward Pixel Killing (Mali)技术都是为了最大限度减少被遮挡pixel的texturing 和 shading。
- TBR主要是 cached friendly, 在cache中读写的速度比全局内存中要快得多,从而降低带宽消耗并省电
缺点:
3. binning在vertex阶段之后,先将几何数据输出到DDR,再被fragment shader读取。几何数据过多的管线,容易在此处有性能瓶颈
4. 如果某些三角形叠加在数个tile上,需要绘制数次。这意味着总渲染时间将高于即时渲染模式。
Binning
不同策略下的Defer实现
1. Adreno的LRZ模块
- 采用外置模块LRZ
- 在正常渲染管线中先多渲染一步VS生成低精度Depth Texture,用以剔除不可见的三角形
- 原理上是利用硬件实现occlusion culling (遮挡剔除),功能类似软光栅中的遮挡剔除
2. Arm Mali采用的FPK
3. IOS PowerVR的HSR
HSR:Hidden surface removal(隐形面剔除)
利用假想的一束光,来进行排序;
- 对每个被投影光束交接的对象进行排序处理
- 使用分块以减少数据集大小
- 只有最近的不透明物体和最近的透明物体需要渲染
- 生于片元被剔除
场景示例:
图中有不透明物体:人物,雕像,墙壁等;
透明物体:激光,UI等;
如果不使用HSR剔除:(类似于Unity里的OverDraw视图效果)
经过HSR优化:
黑色区域代表有不透明物体遮挡,所以背后的物体是完全不可见的。
3.7.6 移动端TBR的优化方法
- 记得不使用Framebuffer 的时候clear 或者 discard
- 不要在一帧中频繁切换framebuffer的绑定
- 在移动平台,建议使用Alpha混合而不是Alpha Test,(根据当前需求进行决定)。在实际生产中,应当尽量避免使用Alpha混合来实现透明,需要进行alpha混合时,尝试缩小混合区域的覆盖范围(减小半透明区域的面积)
- 在手机上必须进行Alpha Test的时候,先做一遍Depth prepass
- 图片尽量压缩
- 图片尽量使用mipmap
- 尽量使用从Vertex Shader传来的varying变量uv值(连续的)采样贴图,不要在FragmentShader里动态计算贴图的UV值(非连续),否则CacheMiss
- 在延迟渲染中,尽量利用Tile Buffer
- 如果调整纹理的质量,调整整体分辨率会造成帧率的变化,那么多半是带宽的问题
- MSAA在TBDR下是非常快速的,MSAA属于硬件层面,发生在片上。
- 少在FS中使用discard函数,调用gl_FragDepth从而打断Early-DT(HLSL中为Clip,GLSL中为discard)
- 在shader里面浮点数精度,有目的的区分使用float,half
- 在移动端的TBDR架构中,顶点处理部分,容易成为瓶颈,应当尽量避免使用曲面细分shader,置换贴图等负操作。
- 提倡使用模型LOD,本质上减少FrameData的压力,Unity中尽早在应用阶段借助umbra遮挡剔除
参考目录
- [GPU性能指标 ]
https://www.gpuinsight.com/gpu_performance/ - [三星的GPU-FrameBuff指导]
https://developer.samsung.com/galaxy-gamedev/resources/articles/gpu-framebuffer.html - [英伟达的TBR教学文章]
https://www.techpowerup.com/231129/on-nvidias-tile-based-rendering - [ARM的TBR教学文章]
https://developer.arm.com/solutions/graphics-and-gaming/developer-guides/learn-the-basics/tile-based-rendering/single-page - [苹果OpenGL程序开发指南]
https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Performance/Performance.html - [OpenGL Insights]
https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf - [知乎文章:Tile-based 和 Full-screen 方式的 Rasterization 相比有什么优劣]
https://www.zhihu.com/question/49141824 - [移动设备GPU架构知识汇总]
https://zhuanlan.zhihu.com/p/112120206 - [再议移动平台的AlphaTest效率问题]
https://zhuanlan.zhihu.com/p/33127345 - [移动平台GPU硬件学习与理解]
https://zhuanlan.zhihu.com/p/347001411 - [PowerVR开发者指南]
http://cdn.imgtec.com/sdk-documentation/Introduction_to_PowerVR_for_Developers.pdf - [Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校]
https://www.cnblogs.com/gameknife/p/3515714.html - [TBDR的HSR流程细节和使用AlphaBlend的效率提升程度]
https://www.zhihu.com/question/49141824 - [当我们谈优化时,我们谈些什么]
https://zhuanlan.zhihu.com/p/68158277
https://edu.uwa4d.com/course-intro/1/179 - [Alpha Test的双pass 优化思路]
https://zhuanlan.zhihu.com/p/58017068 - [个人收藏]
https://github.com/killop/anything_about_game#gpu-architecture - [Adreno Hardware Tutorial 3: Tile Based Rendering]
https://www.youtube.com/watch?v=SeySx0TkluE&pbjreload=101 - [Mali GPU的独有特性]
https://www.cnblogs.com/hamwj1991/p/12404551.html - [Mali-T880]
http://grmanet.sogang.ac.kr/ihm/cs170/20/HC27.25.531-Mali-T880-Bratt-ARM-2015_08_23.pdf - [熊大的优化建议]
http://www.xionggf.com/post/unity3d/shader/u3d_shader_optimization/ - [GPU画像素的顺序是什么]
https://zhuanlan.zhihu.com/p/22232448 - [Tile-based Rasterization in Nvidia GPUs with David Kanter of Real World Tech]
https://www.youtube.com/watch?v=Nc6R1hwXhL8&t=973s&pbjreload=101
作业
学习一下unity中的UPR(unity performance reporter)测试服务,使用虚拟机或者云真机进行测试。
云真机比较方便:
比较了曲面细分不同程度下的帧率变化:
首先是这个超级密集(Tessellation uniform = 64):
可以看到帧率很低,平均12.78帧;
减低曲面细分程度到16,
平均帧率直接翻倍:
这里可以看到,细分程度在16的时候其实草已经挺密集的了,可能是面积不大的缘故,并没有出现其他同学作业中所说的帧率直线下降的情况。
当尝试用模拟器进行性能调试的时候发现,这个曲面细分的shader直接不起作用报错了
用的还是unity推荐的这个夜神模拟器,尝试对显卡渲染模式就行修改也无法消除bug,很奇怪,记录一下。