笔记21 移动端TB(D)R架构基础
当前移动端GPU概况
(由DeepSeek整理)
1. 移动端和桌面端功耗对比
- 高性能台式机:过去是300W,现在主流性能平台满载功耗已达400W-500W(高端CPU约200-280W,顶级CPU解锁功耗墙后可达370-400W)。若搭配旗舰级独立显卡(功耗约300-400W),整体峰值功耗可轻松突破700W-800W。
- 主流笔记本:范围大致在50-150W之间。其中轻薄本多在15-35W区间,游戏本功耗更高。
- 高端游戏本:旗舰级游戏本(搭载i9/HX处理器及高端显卡)功耗显著提升,普遍达到200W-250W。
- 旗舰平板:范围是8-15W。虽然在移动设备中相对较高,但仍远低于笔记本。
- 旗舰手机:峰值功耗已达到7-12W。2026年旗舰芯片(如骁龙8 Gen 4)的峰值功耗已高达7.8W。
2. 移动端和桌面端内存带宽对比
在过去,桌面端内存带宽常是移动端的10倍以上。但在2026年,这一差距已大幅缩小,主要归功于LPDDR6等低功耗高速内存的普及。不过,桌面平台的绝对带宽上限依然更高。
- 移动端旗舰:目前可达约80-120 GB/s(如LPDDR6)。
- 桌面主流:DDR5双通道配置通常能提供60-100 GB/s的带宽。
- 桌面高端(如使用DDR5-8000):带宽可达120-150 GB/s。
- 桌面发烧级(如四通道DDR5):带宽可轻松超越200 GB/s。
名词解释
Soc是把 CPU、GPU、内存、通信基带、GPS模块等等整合在一起的芯片的称呼。常见有A系列SoC(苹果),骁龙SoC(高通),麒麟SoC(华为),天玑SoC(联发科),Exynos SoC(三星)。而苹果随后推出的M系列SoC,原本专用于Mac,如今A系列与M系列的界限正变得模糊,Mac新品甚至开始直接搭载旗舰级手机芯片。这不仅验证了手机、笔记本和PC使用通用芯片的路径已经彻底走通,更标志着整个PC行业向ARM架构的深层转型正在加速。
Soc中 GPU 和 CPU 共用一块片内 LPDDR 物理内存,就是我们常说的手机内存,也叫 System Memory,大概几个G。此外CPU和GPU还分别有自己的高速SRAM的Cache缓存,也叫On-chip Memory,一般几百k~几M。不同距离的内存访问存在不同的时间消耗,距离越近消耗越低,读取 System Memory 的时间消耗大概是On-chip Memory的几倍到几十倍。
- Soc 上 GPU 和 CPU 共享一个内存地址空间。
- On-Chip Memory:在TB(D)R架构下会存储 Tile 的颜色、深度和模板缓冲,读写修改都非常快。
- Stall:当一个GPU核心的两次计算结果之间有依赖关系而必须串行时,
等待的过程便是Stall。 - FillRate:像素填充率= ROP 运行的时钟频率 × ROP 的个数 × 每个时钟ROP可以处理的像素个数
TB(D)R 是目前主流的移动GPU渲染架构,对应一般PC上的GPU渲染架构–IMR(Immediate Mode Rendering)。
TB(D)R简单的意思:屏幕被分块(16*16像素或者32*32像素)渲染
TBR 流程:Vertex Shader -> Defer -> RS(光栅化) -> Pixel Shader
TBDR 流程:Vertex Shader -> Defer -> RS -> Defer -> PS
Defer是什么?
- 字面是延迟,但从渲染数据的角度来看,Defer就是“阻塞+批处理”GPU的“一帧”的多个数据,然后一起处理
立即渲染(IMR)
这种架构在传统桌面 GPU(如 AMD、NVIDIA 早期产品)中非常普遍,它的特点是 “来一个图元,处理一个图元”,不会对帧缓冲区进行分块或中间缓存。
1 | for draw in renderPass: // 遍历每个绘制调用 |
出处:https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/
优点
- 简单直接:硬件逻辑相对简单,无需管理 tile 缓存或分块调度。
- 低延迟:顶点处理完立即光栅化,适合需要最小渲染延迟的场景(如 VR 或实时交互)。
- 易于实现复杂算法:对随机访问帧缓冲区的渲染特性(如 UAV、无序访问视图)支持良好。
缺点
- 带宽消耗大:每个片段着色器读写帧缓冲区和深度/模板缓冲区都会产生显存流量。尤其是深度测试、混合操作,会频繁读写片外 DRAM。
- 功耗较高:大量的片外内存访问导致功耗显著高于基于 Tile 的架构。
- 对 overdraw 敏感:如果场景中有大量重叠的三角形,后面的像素着色器仍然会执行,造成浪费(虽然有 Early-Z 优化,但仍需顶点处理)。
基于块元的渲染TB(D)R
TB(D)R 宏观上总共分2个阶段。
- 1:(分图元)第一阶段执行所有与几何相关的处理,并生成 Primitive List (图元列表),并且确定每个 tile 上面有哪些 primitive
- 2:第二阶段将逐块执行光栅化及其后续处理,并在完成后将 Frame Buffer 从 Tile Buffer 写回到 System Memory 中。
1 | # Pass one |
出处:https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/
TB(D)R的硬件渲染顺序
实际中GPU硬件中的乱序执行,过渡的地方还是有一定的随机性。
IMR和TB(D)R 对比
TBR的核心目的是降低带宽,减少功耗,但渲染帧率上并不比IMR快
TBR的优点
- (1):TBR 给消除 Overdraw 提供了机会,PowerVR用了HSR技术,Mali用了ForwardPixelKilling技术,目标一样,就是要最大限度减少被遮挡pixel的texturing和shading。
- (2):TBR主要是 cached friendly, 在cache里头的速度要比全局内存的速度快的多,以及有可能降低render rate的代价,降低带宽,省电
TBR的缺点
- (1):binning 操作需要在 vertex 阶段之后,将输出的几何数据写入到DDR,然后才被fragment shader读取。这之间也就是tile写入DDR的开销和 fragment shader渲染读取DDR开销的平衡。另外还有一些操作(比如tessellation)也不适用于TBR;
- (2):如果某些三角形叠加在数个图块(Overdraw),则需要绘制数次。这意味着总渲染时间将高于即时渲染模式。
第一个Defer:Binning 过程
类似四叉树。
“在渲染前,先精确计算出每个屏幕 Tile 里有哪些三角形”的预分析阶段。它的核心价值在于将带宽消耗巨大的渲染数据,在高效且低功耗的片上内存(On-Chip Memory)中进行处理。
第二个Defer:不同GPU的 Early-Depth-Test
1.Mali 的 FPK
- Qualcomm Adreno:采用独立硬件单元 LRZ(Low Resolution Z)。在正常渲染管线之前,硬件会快速执行一次低精度的深度测试(基于简化后的深度缓冲),提前剔除被遮挡的三角形(Tile 级别)。其实现细节未公开,但效果类似于硬件级的遮挡剔除(类似软光栅的 occlusion culling 但更快)。
- Arm Mali:引入 Forward Pixel Kill (FPK) 技术(自 Mali-T880 开始)。当片段着色器执行前,FPK 单元会检查深度缓冲中已有像素的深度值,如果当前片段的深度大于(更远)已存储的深度,则直接丢弃该片段,避免执行无用的像素着色。这相当于在像素粒度上实现了 early-z 的增强版,但 Mali 的 TBR 架构使其更高效。
2.PVR的HSR
- PowerVR(TBDR):采用独特的 HSR(Hidden Surface Removal) 技术,实现零 overdraw(不透明物体),极大节省带宽和功耗。其核心流程:
- 在几何处理阶段(Binning 之后),对每个 tile 内的所有图元按深度排序。
- 只保留每个像素位置上深度最小的不透明片段(最近的),以及按顺序混合的透明片段。
- 其余被遮挡的片段在进入像素着色器之前就被完全剔除,不消耗任何着色资源。
移动端TBR优化建议
记得不使用 Framebuffer 的时候 clear 或者 discard
- 主要是清空积存在 tile buffer 上的中间数据,所以在unity里面对 render texture 的使用也特别说明了一下,当不再使用这个rt之前,调用一次Discard。在OpenGL ES上善用glClear,gllnvalidateFrameBuffer避免不必要的Resolve(Resolve 就是 tile buffer 刷新到 system memory)行为
不要在一帧里面频繁的切换 frame buffer 的绑定
- 本质上就是减少tilebuffer和system memory之间的的stall操作
对于移动平台,建议你使用Alpha混合,而非Alpha测试。在实际使用中你应该分析并比较Alpha测试和Alpha混合的表现,因为这取决于具体内容,因此需要测量,通常在移动平台上应避免使用Alpha混合来实现透明。需要进行Alpha混合时,尝试缩小混合区域的覆盖范围
手机上必须要做Alpha Test,先做一遍Depth prepass,参考AlphaTest的双pass优化思路
图片尽量压缩例如:ASTC ETC2
图片尽量走mipmap
尽量使用从 Vertex Shader 传来的Varying变量Uv值采样贴图(连续的)不要在FragmentShader里动态计算贴图的Uv值(非连续的),否则CacheMiss
在延迟渲染尽量利用TileBuffer,参考【找不到链接】传统延迟渲染和TBDR
如果你在Unity里面调整ProjectSetting/Quality/Rendering/TextureQuality不同的设置,或者不同的分辨率下,帧率有很多的变化,那么十有八九是带宽出问题啦
MSAA在TBDR下反而是非常快速的。
少在FS中使用 discard 函数,调用gl_FragDepth从而打断Early-DT(HLSL中为Clip,GLSL中为discard)
在shader里面浮点数精度,有目的区分使用float,half。
- 好处:(1)带宽用量减少(2)GPU中使用的周期数减少,因为着色器编译器可以优化你的代码以提高并行化程度。(3)要求的统一变量寄存器数量减少,这反过来又降低了寄存器数量溢出风险。具体有哪些数据类型适合用half或者float或者fix,请查看参考 【链接挂了】熊大(熊新科,《Unity 3D 内建着色器 源码剖析》作者)的优化建议 和 [【找不到链接】Shader数学计算优化技巧]
在移动端的TB(D)R架构中,顶点处理部分,容易成为瓶颈,避免使用曲面细分shader,置换贴图等负操作,提倡使用模型LOD,本质上减少FrameData的压力,Unity中尽早在应用阶段借助umbra遮挡剔除,参考[【找不到链接】occlusion-culling-tutorial] [【找不到链接】天涯明月刀手游优化]
-作业-
1、结合课程内容,将最近做的 demo 继续安卓平台打包,对比使用课上提到的优化点前后的性能变化。
- 标题: 笔记21 移动端TB(D)R架构基础
- 作者: 铁名_IronName
- 创建于 : 2026-04-04 19:22:17
- 更新于 : 2026-04-05 10:45:11
- 链接: https://blog.ironname.top/2026/笔记21-技术美术百人计划/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。