移动端图形与功耗 · 第 一 篇

两台不同的机器:移动 GPU 的物理约束

2026-09-1318,856 字116 张配图本文由@溯光 出品,转载请注明出处

站点链接:技术博客页

【实时渲染管线探析】姊妹系列 · 《移动端图形与功耗》第 1 篇 | 系列共 7 篇

  • 上一篇:(本系列首篇)
  • 下一篇(预告):【移动端图形与功耗】(二) 分块渲染:binning、片上内存与它的代价
题图
题图题图:一部手机的零部件摊开@ Wikimedia Commons · DYVER(CC BY-SA 4.0)

系列文章前言

1.1 系列定位

OK,言归正传。写这个系列的起因很具体:我们在桌面端调好的渲染方案,搬到手机上往往不是"变慢一点",而是画风都变了——帧率掉到个位数,机身发烫,十几分钟后又莫名其妙恢复。

这类现象通常被归为"优化没做好"。但更准确的说法是:移动 GPU 和桌面 GPU 不是同一种机器的小型化版本,而是被不同物理约束塑造出来的两种设计。同样一句采样、同样一次混合,在两台机器上的代价可以差一个数量级。这不是实现的锅,是前提不同。

把边界划在前面:本篇不涉及具体机型与芯片型号的性能排名(排名半年就过期,约束不会),不涉及着色器语言与引擎的完整配置手册(那属于各引擎文档),也不给"最佳设置"(脱离机型与画质目标谈最佳是伪命题)——这一篇只立前提。

所以本系列的目标不是给一份"移动端优化清单"——那样的清单网上已经很多了,而且往往只写了"关掉什么",没写"为什么关、关掉能省多少"。我们要做的是另一件事:把移动端图形的物理前提讲清楚,再把工程后果一项项接上去。前提清楚了,清单就能自己推出来;前提不清楚,清单背下来也会用错地方。

1.2 这个系列要讲清的一件事

先把立论摆出来。一句话:移动端图形的每一个工程选择,背后都对应一份明确的物理账。这份账只有两页——带宽与功耗。凡是省带宽、省功耗的做法,在移动端就可能划算;凡是不省这两样的"高级效果",在移动端就得先证明自己值这个价。

这听起来像正确的废话,但把它落到具体决策上,就会立刻变得尖锐。举三个本系列会反复遇到的例子:

  • 为什么移动端倾向把渲染拆成"先建几何列表、再逐块着色"两趟,而不是像桌面那样一路画到底?
  • 为什么同一张阴影贴图,桌面可以 4K,移动端 1K 就要掂量?
  • 为什么"跑分 60 帧"的机器,玩二十分钟只剩 40 帧,而另一台跑分只有 45 帧的机器却稳在 42 帧?

这三个问题的答案,都要回到那两页账上。

1.3 全系列内容总览

七篇的递进关系是这样安排的——先立前提、再拆子系统、最后回到实践。第 1 篇立两道墙,第 2 到第 4 篇拆机制、账本与持续性能,第 5、6 篇回到取舍与前沿,第 7 篇收在方法论上。这条主线也决定了阅读顺序:跳读可以,跳过的环节会在后面变成看不懂的结论。

一句话记住全系列的位置:第 1 篇立前提,第 2~4 篇依次拆机制、带宽账本与持续性能,第 5~6 篇回到取舍与前沿,第 7 篇收在方法论。下面用一张表把每篇的位置、回答的问题和与前一篇的关系列清楚。

篇 主题 它回答的问题 与前一篇的关系
1 两台不同的机器:移动 GPU 的物理约束 移动端到底被什么约束?为什么这些约束无法绕过? 立前提(本篇)
2 分块渲染:binning、片上内存与它的代价 分块到底省了什么?代价是什么? 前提 → 机制
3 带宽:移动端最硬的那道墙 每帧的字节都花在哪了?怎么省? 机制 → 账本
4 功耗与热:帧率为什么会掉下去 为什么持续性能只有爆发的一半? 账本 → 持续性能
5 延迟着色在移动端:能做什么、不能做什么 哪些桌面上成立的做法在这里不成立? 前四篇 → 取舍
6 现代特性落地:VRS、网格着色与移动光追 新特性在移动端的真实收益与前提是什么? 取舍 → 前沿
7 测量与调优:怎么证明你真的优化了 怎么量化、怎么验收? 全部 → 方法论

1.4 与已有中文文章的差异

先看看已有的中文资料。移动 GPU 的中文资料其实不少,但读完常有一个感觉:知道了很多名词,仍然做不好决定。我们把已有的中文写作分成三类,并说明本系列的取舍:

类型 典型内容 已经讲得很好的部分 缺口
架构科普 TBDR 是什么、binning 两阶段、片上内存 名词与流程的入门理解 几乎没有量化:省了多少、什么时候不省
引擎操作清单 "关掉 HDR""禁用 Opaque Texture" 可执行的操作项 不解释为什么关、代价与收益的量级
厂商白皮书翻译 Arm / Imagination / Qualcomm 的架构文档 架构的权威表述 面向开发者,缺少横向对照与工程落地取舍

本系列的差异点只有一句话:把架构事实与工程后果用可核对的数字连起来。每个"所以你应该……"的结论,前面必须有一个"因为量级是……"的依据;拿不到依据的地方,我们会明说"这里只有经验,没有数据",而不是拿"一般来说"糊过去。

数据口径也说一句:第三方数字都给出处,"我们实测"的数字都给机型与测试条件,两者不混用。

1.5 相关资源与阅读建议

  • 官方与权威:Arm、Imagination、Qualcomm、Apple 的移动 GPU 文档;学术与量化:SIGGRAPH 移动 GPU 课程、HPG 能效论文、移动热管理系统级研究。
  • 阅读建议:如果只读一篇,读这一篇——后面六篇的技巧都建立在这一篇的前提上;已经清楚"带宽与功耗是硬约束"的,可以直接跳到第 2 篇。
本篇高频术语速查
图 1-1术语对齐速查表@ 本系列绘制

术语先对齐,免得后面反复解释(速查表见下,逐条定义见 2.6 节)。


背景铺垫

2.1 从一次"同一份代码,两种命运"说起

下面我们开始正文。先看现象。同一份渲染代码、同样的资源规格,在桌面显卡上跑 1440p 高画质稳定 120 帧,换到手机上:

  • 画面能出,但平均帧率掉到 10–20 帧;
  • 机身背部迅速升温,能明显感觉到热;
  • 持续十几分钟后,帧率进一步下降,然后在一个更低的水平上稳定下来。

如果这是第一次遇到,通常会怀疑三件事:驱动没适配好、代码里有什么移动端不支持的坏习惯、或者这台手机性能就是不行。这三件事都可能有,但它们解释不了最反常的那一点:为什么同一台手机,同样的场景,跑分能到 60 帧,玩二十分钟却只有 40 帧?

答案是:移动设备上,"能跑多快"和"能跑多久"是两个独立的问题,由两套不同的机制决定。前者取决于算力,后者取决于散热能力与功耗预算。

2.2 两台机器:先看它们长什么样

先看移动端。下面这一组是同类设备从外壳一路拆到硅片的几个层面——顺序刚好是拆机的顺序。

手机整机内部实拍
图 1-2手机整机内部实拍@ Wikimedia Commons · PKFP(CC BY-SA 4.0)
整机拆解实拍
图 1-3整机拆解实拍@ Wikimedia Commons · Medvedev(CC BY-SA 3.0)

请注意三件事:电池占了绝大部分面积、主板只有一条窄长区域、没有任何主动散热部件。这三件事决定了移动 GPU 的全部处境——它的功耗预算来自电池,它的散热上限来自被动散热,它的体积上限来自这条窄长的主板。

手机主板正面实拍
图 1-4手机主板正面实拍@ Wikimedia Commons · MarcoTangerino(Public domain)
手机主板背面实拍
图 1-5手机主板背面实拍@ Wikimedia Commons · MarcoTangerino(Public domain)
掀屏后的板层结构
图 1-6掀屏后的板层结构@ Wikimedia Commons · MarcoTangerino(Public domain)
另一机型主板实拍
图 1-7另一机型主板实拍@ Wikimedia Commons · Mbrickn(CC BY 4.0)
板上器件与走线特写
图 1-8板上器件与走线特写@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)

先看看主板这一级。把主板放大看,SoC 与内存是紧挨着焊在同一块板上的。这个距离在桌面端是几厘米的走线,在手机上被压缩到毫米级——这既带来好处(延迟低),也带来麻烦(散热互相影响、可选封装形式受限)。

板上芯片特写
图 1-9板上芯片特写@ Wikimedia Commons · Mbrickn(CC BY 4.0)
电源管理类芯片
图 1-10电源管理类芯片@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)
屏蔽罩与射频区
图 1-11屏蔽罩与射频区@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)
摄像模组实拍
图 1-12摄像模组实拍@ Wikimedia Commons · Bautsch(CC0)
屏幕总成实拍
图 1-13屏幕总成实拍@ Wikimedia Commons · Peddy https://www.ifixit.com/User/167584/Peddy(CC BY-SA 3.0)

再往里一层是封装与硅片。移动端最常见的做法是把内存直接摞在 SoC 上方(叠层封装),用垂直方向换平面面积——元件不是变少了,而是被摞起来了。下面几张按封装由外到内的顺序看:

叠层封装特写
图 1-14叠层封装特写@ Wikimedia Commons · Mister rf(CC BY-SA 4.0)
晶圆级封装(WLCSP)斜视实拍
图 1-15晶圆级封装(WLCSP)斜视实拍@ Wikimedia Commons · Phiarc(CC BY-SA 4.0)
芯片裸片实拍
图 1-16芯片裸片实拍@ Wikimedia Commons · BirdbrainEngineer(CC0)
GPU 裸片实拍
图 1-17GPU 裸片实拍@ Wikimedia Commons · Fritzchens Fritz from Berlin(CC0)
掌机内部实拍
图 1-18掌机内部实拍@ Wikimedia Commons · PantheraLeo1359531(CC BY 4.0)

桌面对照一下就很明显了。差异不是「性能差一点」,而是设计前提根本不同:桌面可以靠风扇和更大的板面散热,移动端只能靠一块被电池与屏幕夹住的窄板把热量散出去。

现代桌面显卡实拍
图 1-19现代桌面显卡实拍@ Wikimedia Commons · Jacek Halicki(CC BY-SA 4.0)
早期图形卡实拍
图 1-20早期图形卡实拍@ Wikimedia Commons · Agnes Andersson(CC BY 4.0)
桌面处理器裸片实拍
图 1-21桌面处理器裸片实拍@ Wikimedia Commons · cole8888(CC BY-SA 2.0)

结论先行:移动端不是"性能弱一点的桌面",而是"功率被锁死、散热被锁死、面积被锁死"的另一台机器。后面所有的设计差异,都是这三条锁死的推论。

2.3 两份约束的物理来源

移动端图形的两道墙
图 1-22两道墙的概览@ 本系列绘制

说白了,约束只有两条。

第一道是带宽。 GPU 计算所需的操作数、纹理、渲染目标都放在系统内存(LPDDR)里,而 LPDDR 的功耗与带宽特性与桌面的 GDDR 完全不同:

LPDDR 与 GDDR 的特性对照
图 1-23LPDDR 与 GDDR 带宽能效@ 本系列绘制

这张对照图的结论要读两遍:移动端不是"带宽略低",而是"每 pin 带宽与总位宽都被手机形态限制住"。一颗手机 SoC 的内存位宽通常是 64 位或 128 位,桌面显卡是 256–384 位。位宽决定了同一时刻能并行搬运多少数据,这是物理走线数决定的,不是软件能改的。

第二道是功耗。这里最常见的误解是"功耗高就是费电"。真正的机制是:功耗直接变成热量,热量必须散发出去,而手机的散热面积只有几平方厘米、且没有风扇。

功耗与频率、电压的关系(相对量)
图 1-24动态功耗与频率电压@ 本系列绘制

所以移动端真正稀缺的资源不是"电"(电池容量在毫安时级别,够跑几小时),而是「持续散热的功率上限」——通常只有几瓦。这个上限一旦被突破,系统就会限频,而限频是不可谈判的。

2.4 全量清单:移动端图形的全部约束手段

移动端图形的约束手段全量清单
图 1-25全部约束手段清单@ 本系列绘制

在展开之前,先把"移动端能用的手段"穷举一遍,免得后面每讲一个都像是新发现。从减算什么、少搬什么、少耗什么三个阶段归类,清单是:

维度 手段 主要收益 主要代价
减算 视锥剔除、遮挡剔除、背面剔除、LOD 减少顶点/像素着色次数 CPU 或带宽开销、实现复杂度
减算 着色率控制(VRS)、分辨率缩放 直接减少像素着色量 局部画质下降
少搬 分块渲染 + 片上内存 深度/混合/附件不回写显存 几何阶段需缓存、bin 构建开销
少搬 纹理压缩(ASTC/ETC2) 纹理带宽降 4–8 倍 压缩伪影、编码时间
少搬 Render Target 格式精简、MSAA 替代方案 附件带宽成比例下降 精度或边缘质量下降
少搬 只加载 LoadOp/StoreOp 必要的部分 省掉整块附件的读写 需要正确的依赖声明
少耗 降低频率/电压(DVFS)、帧率上限 功耗与温度下降 性能下降(交换)
少耗 减少空转与同步等待 单位功耗产出提高 需要重构提交结构
散热 均热板、石墨片、机身结构散热 提高可持续功率上限 重量、成本、设计复杂度
约束手段的四类归类与可控性
图 1-26约束手段的二次归类@ 本系列绘制

四大类之中,"减算"与"少搬"是渲染开发者能直接控制的,"少耗"一半可控(帧率与同步结构)、一半交给系统(DVFS),"散热"完全属于硬件设计。按可控性再看一遍这张表,优先级就出来了:

减算类手段的触发条件与失效场景
图 1-27减算类手段的细目@ 本系列绘制
减算类手段 触发条件 失效场景 代价落在哪
视锥剔除 物体在相机视锥外 物体横跨视锥边界 CPU 遍历开销
遮挡剔除 物体被完全遮挡 半透明、粒子、动态遮挡者 预处理与查询开销
背面剔除 面朝向背对相机 双面材质、薄片物体 几乎没有
LOD 切换 物体屏幕占比小 切换处的跳变 显存(多套模型)
着色率控制(VRS) 局部区域对比度低 高频细节区域(UI、文字) 局部画质
分辨率缩放 整帧或中间过程 依赖像素精度的效果(如细线) 全局锐度
少搬类手段的前置条件与风险
图 1-28少搬类手段的细目@ 本系列绘制
少搬类手段 省下的流量 前置条件 风险
分块片上处理 深度/混合/瞬态附件的片外读写 平台为分块架构 附件超容量则溢出
纹理压缩 纹理带宽降 4–8 倍 目标平台支持该格式 压缩伪影、编码时间
附件格式精简 与字节数成正比 非 HDR 中间结果 色带、精度不足
附件语义(不读不写) 整块附件的往返 正确声明依赖 声明错误导致画面异常
通道合并打包 少一张 RT 各通道数据可以共享分辨率 解包与位运算开销
少耗与散热类手段
图 1-29少耗与散热类细目@ 本系列绘制
少耗/散热类手段 谁在做 对开发者的意义
DVFS 调频调压 系统固件 只能通过"降低负载"影响它,不能直接控制
帧率上限 开发者 最直接有效的一项:直接设定功耗目标
减少 CPU/GPU 同步与空转 开发者 提高单位功耗的性能产出
读取热余量并主动降档 开发者(需平台支持) 把被动掉帧变成主动取舍
均热板 / 石墨片 / 机身结构 设备厂 决定"可持续功率"这个上限值

一句话总结这四张表:移动端的所有手段,最终都指向"减少进入内存的字节数"或"减少单位时间的能量消耗",没有第三种。

2.5 演进时间线:约束是怎么被逐步认识到的

这二十多年里被「发现」的其实不是新硬件,而是旧做法在新约束下不成立这个事实。下表按该认知在公开文档里被写出来的时间排序,而不是按技术首次出现的时间——第一台 TBDR 商用主机出现在 1998 年,比它被写成共识早了将近十年。

第一台 TBDR 商用主机实拍
图 1-30第一台 TBDR 商用主机实拍@ Wikimedia Commons · Fritzchens Fritz(CC0)
移动端约束认知的演进
图 1-31约束认知的演进时间线@ 本系列绘制
时期 标志 认知上的变化
2000 年代中期 移动 GPU 出现,直接照搬桌面管线 认为移动只是"慢"
2008–2012 PowerVR 的分块与隐藏面消除(HSR)被广泛采用 [Imagination 架构文档] 认识到"少搬字节"比"算得快"更值钱
2013–2016 Metal / Vulkan 等显式 API 出现,附件与依赖可显式声明 [Khronos 规范] 引擎开始主动利用片上内存
2017–2020 持续性能与热设计被系统厂商正式纳入指标 [移动热管理研究] 认识到"跑分"与"可持续"是两件事
2021 至今 可变着色率、网格着色、移动光追进入移动平台 [Arm / Qualcomm 文档] 新特性的收益必须按"每瓦"重新评估

年份口径说明:上表以该认知在公开技术文档中被明确表述的时间为准,不是技术首次出现的时间。

2.6 术语对齐

中文 英文 一句话定义
立即模式渲染 immediate mode rendering, IMR 几何处理完立刻光栅化着色,直接读写显存
分块渲染 tile-based rendering, TBR 先按屏幕分块收集几何,再逐块着色
分块延迟渲染 tile-based deferred rendering, TBDR 分块 + 先确定可见性再着色,消除 overdraw
分桶 binning 把三角形分配到覆盖的屏幕块,产出每块的几何列表
分块 tile / bin 实际着色的屏幕小块,尺寸由 GPU 与开发者共同决定
片上内存 GMEM / tile RAM / on-chip memory GPU 内部用于放当前块及其附件的高速内存
回写 resolve 把片上结果一次性写回系统内存的动作
重复着色 overdraw 同一像素在一帧内被着色多次
动态调频调压 DVFS 按负载与温度调整频率与电压
持续性能 sustained performance 长时间稳定运行时的性能,通常显著低于峰值

2.7 边界声明

边界与前面开篇说的一致,这里只补一条:六步闭环的第 4 步允许以「配置清单 + 伪代码」呈现(本系列按变体 B)。移动端题材以硬件约束与工程取舍为主线,代码密度天然偏低,硬凑长代码段只会稀释信息密度;但凡涉及具体实现,仍给可复现的做法,不接受"一般来说应该……"。

关键参数的取值范围(本篇会反复用到):

参数 典型范围 说明
移动 SoC 内存位宽 64 / 128 位 由走线数决定,软件不可改
可持续散热功率 数瓦量级 依机身尺寸与散热设计浮动
持续性能 / 爆发性能 50%–65% 见第 3 节引用的实测区间
典型触发限频的温度点 70°C 上下 具体阈值依厂商策略

2.8 三个常见误判

在立起前提之前,先把三个最常见的误判摆出来。它们都源于同一种思维习惯:把桌面端的经验直接搬到移动端,而没有检查前提是否变了。

误判 表述 为什么错 正确理解
误判一 "手机慢,是因为算力不够" 移动端的瓶颈通常是带宽与功耗,不是 ALU 吞吐 先定位瓶颈,再决定优化方向
误判二 "按最佳实践清单逐条关掉就行" 清单是"结果",前提不同则结果不同 理解每个开关省的资源,再判断是否命中当前瓶颈
误判三 "跑分高就是性能好" 跑分测的是爆发性能,与持续性能可以差一倍 以"连续 20 分钟稳定帧率"为验收指标

第一个误判最值得展开一点。"算力有余、带宽已满"是可以直接观察到的:把着色器复杂度减半,如果帧率几乎不动,说明瓶颈不在算术上;把渲染分辨率降低一档,如果帧率立刻上升,说明瓶颈在像素与带宽侧。这两次试验加起来不到一小时,却比读十篇优化清单更能定位问题所在。

第二个误判的危害不在"关了不该关的",而在"关了该关的却没效果,于是得出结论:优化没用"。清单上的每一项都对应一个具体资源,如果当前场景不消耗那个资源,关掉它自然没有收益。这也是本系列坚持"每个开关都要说清它省的是什么"的原因。

2.9 贯穿全篇的问题

贯穿全篇的核心问题
图 1-32贯穿全篇的核心问题@ 本系列绘制

把这一篇要立的前提压缩成一句话,就是这篇文章要反复回答的:

在带宽与功耗两道墙的约束下,哪些桌面上的做法可以照搬,哪些必须换一种做法,换法背后的账又该怎么算?

后面六篇,每一篇都在回答这个问题的某一个侧面。这一篇负责把问题问清楚——以及说明,为什么它不是一个"优化技巧"层面的问题,而是一个物理前提层面的问题。

(本篇正文续见下节写入)


一、两台不同的机器:IMR 与 TBR/TBDR

3.1 一句话点题

先看看这一章的落点。这一章回答一个问题:为什么底层架构不同,会导致"同一句采样"在两台机器上代价不同?

答案在于数据在哪、什么时候被写回。桌面 GPU 采用立即模式渲染(IMR),几何与像素一路推进,随时读写显存;移动 GPU 采用分块渲染(TBR),先把几何按屏幕分块收集起来,再逐块着色,块内的深度、颜色、附件都留在片上内存里。这个差别看似只是"顺序不同",但它决定了一帧里有多少字节需要跨芯片搬运——而带宽正是移动端最贵的资源。

TBR 与 IMR 的数据流分岔:tile 先在片上完成着色
图 1-33TBR 与 IMR 的数据流分岔:tile 先在片上完成着色@ Wikimedia Commons · Mewtow · CC BY-SA 4.0
渲染管线:几何 → 光栅 → 片元的阶段顺序
图 1-34渲染管线:几何 → 光栅 → 片元的阶段顺序@ Wikimedia Commons · Bedwyr · CC BY 2.5
多渲染目标:一次 pass 写出多张附件
图 1-35多渲染目标:一次 pass 写出多张附件@ Wikimedia Commons · Faldrian · CC BY-SA 4.0

3.2 原理与概念:IMR 是怎么工作的

立即模式渲染(IMR)的执行结构
图 1-36立即模式渲染流程@ 本系列绘制

IMR 的流程很直白:顶点着色器处理顶点,光栅化把三角形变成像素片段,像素着色器逐片段着色,然后做深度测试与混合,结果写回显存中的渲染目标。整个过程没有全局的重新排序,谁先到谁先画。

顶点着色:平面着色与 Gouraud 着色的效果对照
图 1-37顶点着色:平面着色与 Gouraud 着色的效果对照@ Wikimedia Commons · The original uploader was Loebek at Germ · CC BY-SA 3.0
深度测试:三维场景与其 Z-buffer 数据
图 1-38深度测试:三维场景与其 Z-buffer 数据@ Wikimedia Commons · en:User:T-tus · CC BY 2.0

这种设计的优点是把复杂度交给硬件与驱动程序,开发者不用关心顺序;代价是同一像素可能被反复读写。举个最典型的例子:不透明物体如果按由远及近的顺序绘制,靠近相机的物体会把远处已经画好并写回显存的像素再覆盖一遍——那次写入是纯浪费。桌面 GPU 用 Early-Z 之类的技术缓解,但缓解的前提是绘制顺序合理,而顺序由应用决定,不是硬件能改的。

3.3 原理与概念:TBR 的两阶段与 TBDR 的可见性先行

这一节讲分块在硬件上怎么落地。先看一张权威管线示意图,再看 TBDR 最早的两代商业实现——它不是近年才有的优化技巧,1998 年就作为一颗独立图形芯片的架构卖到了消费市场。

图形管线示意
图 1-39图形管线示意@ Wikimedia Commons · Original: Martin Wantke Vector: AntiCompositeNumber(CC0)
另一颗芯片裸片
图 1-40另一颗芯片裸片@ Wikimedia Commons · Mister rf(CC BY-SA 4.0)

下面两颗芯片分别是第一代与第二代 TBDR 的商业实现。「先确定可见性、再着色」这条路径的硬件证据就在这里——不是从论文推出来的,而是卖过几百万台的图形芯片。

PowerVR Series2(CLX2)芯片裸片微距
图 1-41PowerVR Series2(CLX2)芯片裸片微距@ Wikimedia Commons · Fritzchens Fritz(CC0)
PowerVR Series3(STG-4000)芯片实拍
图 1-42PowerVR Series3(STG-4000)芯片实拍@ Wikimedia Commons · Fritzchens Fritz(CC0)
分块渲染的两阶段
图 1-43分块渲染的两阶段@ 本系列绘制

TBR 把一帧拆成两趟。第一趟是几何阶段(binning):所有顶点变换完成后,光栅化只做"这个三角形覆盖了哪些块"的判断,把结果记进每个块的三角形列表——这一步不产生任何像素。第二趟是瓦片处理阶段:逐块取出它的三角形列表,着色这一块的所有像素,块内数据全放在片上内存里,最后一次性回写(resolve)到系统内存。

TBDR 多出来的那一步
图 1-44TBDR 在 TBR 基础上多了一步@ 本系列绘制

TBDR 在此基础上多了一层:先决定可见性,再着色。同一块里,硬件先做隐藏面消除(hidden surface removal, HSR),确定每个像素最终可见的是哪个片元,然后只对它执行纹理采样与着色。这一点很关键——它把 overdraw 从"尽量缓解"变成了"基本消除",而且与绘制顺序无关。Imagination 在文档里把这个机制称为其架构的核心特征,并明确描述了它的效果:只有最终会被看到的像素才消耗着色资源 [Imagination 架构文档]。

纹理映射:仿射映射的失真效果
图 1-45纹理映射:仿射映射的失真效果@ Wikimedia Commons · Rainwarrior · CC BY-SA 4.0

这也是"两台机器"这个说法最扎实的地方:桌面 GPU 靠"画得快"取胜,移动 GPU 靠"尽量不画"取胜。

3.4 公式或参数逐项释义:块大小、桶数与片上内存

分块的具体参数决定了收益与代价,逐项说清:

参数 含义 取值影响 谁决定
块尺寸(tile size) 每次着色的屏幕小块边长 越大越省管理开销,但片上内存需求越大 GPU 架构固定(常见 16×16 到 32×32 像素量级)
桶数(bin count) 几何阶段把屏幕切成的块数 桶越多,单桶几何越少、但每帧的块调度开销越大;部分平台允许开发者影响 驱动/开发者可影响
片上内存容量(tile RAM / GMEM) 存放当前块颜色、深度、附件的空间 决定能同时挂多少个渲染目标、能否开 MSAA 硬件固定
单块附件字节数 颜色 + 深度 + 模板 + 其他附件的总字节 直接决定片上内存占用与是否溢出到显存 开发者可设计
回写次数 每帧把片上结果写回几次 越少越省带宽;多渲染目标切换会打断 开发者可设计

这里有一条容易踩的边界:片上内存是有限的。如果附件太多(比如同时挂颜色 + 深度 + 多张自定义 RT),或者 MSAA 采样数太高,块内数据放不下,硬件就必须溢出到系统内存——这时候"零带宽"的收益直接消失,甚至比 IMR 更差,因为多了分桶与调度的开销。

多重采样的取样格点(Quincunx)
图 1-46多重采样的取样格点(Quincunx)@ Wikimedia Commons · Vierge Marie · Public domain
片上内存占用随附件数的增长(示意图)
图 1-47片上内存与附件数@ 本系列绘制

把这个边界拆到每一个参数上,就能看出各自的"可行区间"在哪里:

参数 取值偏小会怎样 取值偏大会怎样 现实中的选择
块尺寸 每帧块数多、调度开销上升 片上内存需求上升,易溢出 由 GPU 架构固定,开发者无法改
桶数(bin count) 单桶几何过多,缓存压力大 每块几何太少,桶管理开销占比高 部分平台可让开发者影响
片上内存容量 可挂附件少,被迫多趟渲染 — 硬件固定,是"能不能开 HDR+MSAA"的硬门槛
单块附件字节数 省,但功能受限 溢出到系统内存,收益反转 开发者最该精打细算的一项
回写次数 收益最大 过度合并会限制管线灵活性 开发者可设计,需权衡
单块附件的三个相乘因素
图 1-48单块附件与片上内存@ 本系列绘制

从这张表能得到一条很实用的判据:当有人问"移动端能不能开 HDR + 4×MSAA + 多渲染目标"时,正确的回答不是"能"或"不能",而是"要看单块附件字节数是否越过该平台的片上内存上限"——而这三项会相乘放大,很容易越线。

四个平台的机制口径对照
图 1-49四家平台机制差异@ 本系列绘制
平台 架构取向 可见性处理 对开发者的可见差异
Arm(Mali / Immortalis) 分块渲染 逐块处理,深度在片上 附件语义与 tile 尺寸对性能影响显著
Imagination(PowerVR) 分块延迟(TBDR) 硬件 HSR,与绘制顺序无关 overdraw 主要由硬件消除,无需应用排序
Qualcomm(Adreno) 分块 + GMEM 片上附件与快速解析 GMEM 容量决定可否合并通道
Apple(GPU 家族) TBDR 片上完成可见性与附件 显式 API 直接暴露 tile 语义

还有一件容易被忽略的事:片上处理会被某些操作打断。下面这张图说明哪些操作会迫使硬件提前把块回写——它对应上表里的「回写次数」,也是开发者真正能控制的一项。

什么会打断片上处理
图 1-50resolve 的时机与代价@ 本系列绘制

从「逻辑上限」到「物理上限」还有一步:分块逻辑与存储阵列都落在同一片硅上,集成度决定了片上内存能给多少。下面这张显微照里,逻辑区与存储阵列的分区看得一清二楚。

单片芯片裸片显微实拍
图 1-51单片芯片裸片显微实拍@ Wikimedia Commons · Zom-B(CC BY-SA 4.0)

读法是看哪一列差异最大:对渲染开发者影响最直接的是"可见性处理"那一列——在 Imagination 的架构上纠结绘制顺序通常是白费力气,而在别的平台上它仍然有意义。这也解释了为什么很多"排序优化"的经验在不同手机上效果差异巨大。

绘制顺序对片元着色次数的影响(示意)
图 1-52IMR 下的 overdraw 代价实例@ 本系列绘制
binning 阶段的内部步骤
图 1-53binning 阶段的内部步骤@ 本系列绘制

3.5 实现与配置:从几何到 resolve,可以做和不能做的

按变体 B,这一步用配置清单 + 伪代码说明,不给长代码段落。

(1)声明附件不需要回读——这是最直接的收益点。

【渲染通道配置示意 · 伪代码】

render_pass:
    颜色附件:
        format:   RGBA8            # 不要无脑上 RGBA16F
        load_op:  CLEAR            # 上一帧内容不需要
        store_op: DONT_CARE        # 这一帧画完没人读它
    深度附件:
        format:   D24S8
        load_op:  CLEAR
        store_op: DONT_CARE

上面这几行里真正省钱的是 store_op: DONT_CARE 与 load_op: CLEAR——它们明确告诉硬件"这块附件的旧内容不用读、新内容不用写回"。桌面端这么写只是省一点,移动端这么做能直接省掉整块附件的往返流量。Arm 的移动端实践讲义把这类"零带宽"附件(深度、混合、瞬态附件)列为移动 GPU 的核心收益来源之一 [Arm Vulkanised 2023 讲义]。

(2)把多个渲染步骤合并进同一个渲染通道。

【合并渲染通道示意 · 伪代码】

before:  通道A(写 G-Buffer) → 回写 → 通道B(读 G-Buffer 做光照)
after:   通道A + 通道B 合并为同一通道(借助 tile 内的读写)

收益:    G-Buffer 不再往返系统内存
代价:    片上内存占用上升,可能触碰容量上限

(3)不要在块内混用会打断 resolve 的操作。例如在同一个通道内反复切换渲染目标、或者对同一附件既要写又要读(除非平台支持块内读写)。

(4)不要指望它替你做剔除。分块只解决"同一像素被重复着色"的问题;看不见的东西(视锥外、被完全遮挡)仍然要经过几何阶段,那是另一个问题,第 5 篇会讲。

3.6 效果与量化:省下的到底是多少

先看看量化落在哪。这一章的量化要落到三处具体的字节账上(第 4 节会给出完整的每帧账本,这里先给结论方向):

环节 IMR 的典型流量 TBR/TBDR 的典型流量 差异来源
深度读写 每个像素多次读 + 写回 块内完成,通常不产生片外深度流量 片上深度测试
混合(blending) 每层混合一次读 + 写 块内混合,最后一次写回 片内累积
瞬态附件 写回 + 读回 声明 DONT_CARE 后完全不产生 附件语义
MSAA 采样数成倍放大附件流量 块内解析(resolve)后再写回一份 采样在片上完成
三类流量的机制性差异
图 1-54三类流量机制对照@ 本系列绘制

需要强调一句口径:表中"典型流量"是架构层面的机制性差异,不是某一台设备上的实测值。本系列凡给机制性结论,一定标明"机制上如此";凡给数字区间,一定标注来源。混着说会让人误以为机制差异就是实测收益,而实测收益还要看具体场景是否真的触发这些路径。

顺带给出 overdraw 的可测量定义,因为它经常被当成一个模糊的词用:Apple 在其 GPU 计数器的官方讲解中给出的定义是——overdraw = 片元着色器调用次数 ÷ 实际存储的像素数,并建议用 GPU 计数器分别测量光栅化像素数、片元着色调用数、存储像素数与 Pre-Z 测试失败数,以此评估隐藏面消除的效率 [Apple GPU Counters]。有了这个定义,"overdraw 是 4.2 倍"才有确切含义(每写入 1 个像素平均执行了 4.2 次片元着色),也才能作为优化验收的指标。

片元着色:Blinn-Phong 光照模型
图 1-55片元着色:Blinn-Phong 光照模型@ Wikimedia Commons · Davi.trip · CC BY-SA 4.0
立即模式渲染与分块渲染的结构差异
图 1-56IMR 与 TBR/TBDR 的完整对照总表@ 本系列绘制

3.7 源码与数据链接

  • Imagination,PowerVR 图形架构说明(延迟着色与隐藏面消除的机制描述):https://www.imaginationtech.com/products/gpu/graphics-architecture/
  • Imagination,Hidden Surface Removal 效率(overdraw 与逐 draw 排序的局限):https://docs.imgtec.com/starter-guides/powervr-architecture/html/topics/hidden-surface-removal-efficiency.html
  • Arm,Getting started on mobile and best practices for Arm GPUs(Vulkanised 2023):https://vulkan.org/user/pages/09.events/vulkanised-2023/vulkanised_2023_getting_started_on_mobile_and_best_practices_for_arm_gpus.pdf
  • Apple,Tailor your apps for Apple GPUs and tile-based deferred rendering:https://developer.apple.com/documentation/Metal/tailor-your-apps-for-apple-gpus-and-tile-based-deferred-rendering
  • Qualcomm,Adreno GPU Game Developer Guide · Overview(分块渲染与 GMEM):https://docs.qualcomm.com/doc/80-78185-2/topic/overview.html

3.8 这一章留下的问题

架构层面的收益已经清楚了:分块的真正价值在于把深度、混合与瞬态附件留在片上。但还有一个更基础的问题没有回答——一帧到底有多少字节必须跨芯片搬运?带宽账本里,除了附件还有纹理、还有缓冲、还有各种被忽略的隐式流量。下一章把这张账摊开算。


二、带宽:移动端最硬的那道墙

4.1 一句话点题

先看看这一章的落点。这一章回答:每帧的字节都花在哪了,以及为什么带宽比算力更值得优先看。

先给结论:在移动端,算力通常还有余量,带宽才是最先撞上的墙。这不只是因为带宽小,更因为"碰内存"这件事本身的代价被严重低估——它既贵在字节,也贵在延迟与能量。Arm 在其移动 GPU 课程里给过一句总结式的判断:算力的缩放速度快于内存带宽的缩放速度,而碰内存是昂贵的 [Arm SIGGRAPH 2024 讲义]。

4.2 原理与概念:内存层级与"碰内存是贵的"

说白了,现代 GPU 的存储层级从里到外是:寄存器、片上内存与各级缓存、系统内存。层级之间的差别不是线性的,而是数量级级别的:

层级 容量量级 延迟量级 每次访问的单位能耗
寄存器 每线程几十个 1 个周期 最低
片上内存 / 缓存 数十 KB 到数 MB 数十周期 低
系统内存(LPDDR) GB 级 数百周期 高(跨芯片往返)

一个反直觉但很关键的事实是:DRAM 即使不被访问也在耗电。它需要周期性刷新来维持数据 [带宽优化实践]。"不访问就不耗电"是错的,但"访问一次代价高昂"更是被低估的那一半——一次缓存未命中的代价不只是那几十个字节,还包括跨芯片往返的延迟与能量。

缓存未命中:多级缓存到主存的层级结构
图 1-57缓存未命中:多级缓存到主存的层级结构@ Wikimedia Commons · Kbbuch · CC BY-SA 4.0
一次缓存未命中的完整路径
图 1-58缓存未命中的路径@ 本系列绘制

「碰内存是贵的」里的那个「内存」长什么样?下面是一颗 DRAM 的裸片实拍——存储阵列是整片硅上最规整、占比最大的部分。这种规则性正是它便宜到能做成 GB 级、又慢到必须靠多级缓存遮住延迟的原因。

DRAM 裸片实拍
图 1-59DRAM 裸片实拍@ Wikimedia Commons · Mister rf(CC BY-SA 4.0)

4.3 原理与概念:LPDDR 的物理特性

移动 DRAM 颗粒实拍
图 1-60移动 DRAM 颗粒实拍@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)
移动 DRAM 颗粒
图 1-61移动 DRAM 颗粒@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)
导航仪主板上的内存颗粒实拍:另一家厂商的封装形态
图 1-62导航仪主板上的内存颗粒实拍:另一家厂商的封装形态@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)
移动内存模组特写
图 1-63移动内存模组特写@ Wikimedia Commons · PantheraLeo1359531(CC BY 4.0)
开封封装的 BGA 焊球
图 1-64开封封装的 BGA 焊球@ Wikimedia Commons · (公有领域作品,见来源页)(Public domain)

移动端用的是 LPDDR(低功耗双倍数据率内存),它的设计目标与桌面的 GDDR 不同——LPDDR 优先低功耗与低引脚数,GDDR 优先高带宽。代价是每 pin 带宽明显更低:按 HPG(High Performance Graphics)会议的材料,LPDDR 的每 pin 带宽不到 GDDR 的一半,但在峰值频率下的能效高出约 10% [HPG 2019 移动 GPU 能效材料]。

维度 LPDDR(移动) GDDR(桌面显卡)
优化目标 低功耗、低引脚数 高带宽
每 pin 带宽 相对较低 约为 LPDDR 的两倍以上
总线位宽 64 / 128 位 256 / 384 位
能效(每 GB/s 的功耗) 更好 较差
封装 直接焊在主板上(或叠在 SoC 上) 显存颗粒 + 独立走线

这两行合起来才是完整的结论:移动端不仅每 pin 慢,而且总位宽小,两个因素相乘,理论带宽比桌面显卡低一个数量级——而这是硬件设计决定的,软件无法绕过。

Arm 在 SIGGRAPH 2018 的移动图形课程里给过一个更直观的量级描述:移动端的渲染性能相比中端桌面低 10–20 倍,且这个差距在渲染结构(rendering structures)上比普通渲染更大 [Arm SIGGRAPH 2018]。这个数字比"低一个数量级"更有用,因为它区分了"普通渲染"与"结构复杂的渲染"——后者才是移动端真正吃力的地方。

4.4 公式或参数逐项释义:一帧的字节账

现在把账摊开。一帧的片外流量大致由这几项构成:

项目 付费次数 说明 压缩手段
纹理采样 每个像素 × 采样次数 最大的一项,取决于材质复杂度与 mip 覆盖 纹理压缩(ASTC / ETC2)
颜色附件(RT) 写 1 次 + 可能的读 与 RT 数量、格式、分辨率成正比 降格式、降分辨率、合并通道
深度/模板 读 + 写 依赖深度测试的时机 片上完成(分块架构)
顶点/索引缓冲 每个顶点 1 次 与三角形数量成正比 索引复用、几何压缩
Uniform / 常量 每次绘制 通常很小但同步敏感 合并更新、常量缓冲
阴影贴图等中间产物 写 1 次 + 读多次 分辨率的平方关系 降分辨率、级联、复用
一帧字节账的逐项拆解
图 1-65一帧字节账拆解表@ 本系列绘制

再叠加分辨率的平方关系,就能看出为什么移动端对分辨率如此敏感:

【分辨率与带宽的关系 · 伪代码】

带宽 ≈ 像素数 × 每像素字节 × 读写次数
像素数 = 宽 × 高

例:从 1080p 提到 1440p
    像素数 × 1.78   →   带宽需求 × 1.78
    若同时把亮度精度从 8bit 提到 16bit(RT 格式变化)
    每像素字节 × 2  →   总带宽 × 3.56

要记住的判据只有一条:先看哪一项的"付费次数 × 像素数"最大,先动它。

把六项逐一拆开,每一项的节省空间与手段就清楚了:

纹理采样流量的构成
图 1-66纹理采样流量的构成@ 本系列绘制
项目 付费次数 主要放大因素 最有效的手段
纹理采样 每像素 × 采样次数 mip 未生效、各向异性过度、采样点过多 纹理压缩 + 正确的 mip 与过滤设置
颜色附件 写 1 + 可能读 分辨率、格式字节数、RT 数量 降格式、中间过程降分辨率、少开 RT
深度/模板 读 + 写 是否在片上完成 分块架构 + 附件语义声明
顶点/索引 每顶点 1 次 三角形数量、索引是否复用 索引复用、几何压缩、LOD
Uniform/常量 每次绘制 绘制调用数量 合批、常量缓冲、减少状态切换
中间产物 写 1 + 读多次 分辨率的平方 降分辨率、级联、按需重算

把"每帧可用字节"这个上限落成一个具体的数,账就变得可算了:按公开的移动 GPU 功耗建模结果,DRAM 访问的代价约为每 GB/s 80–100mW,而在典型的内存功率预算(约 650mW)下,60fps 每秒能搬的等价值约为每帧 100MB [移动 GPU 功耗建模]。这意味着"每帧 100MB"量级可以作为移动端字节预算的起点——一张 1080p 的 RGBA8 颜色附件就是约 8.3MB,写一次读一次是 16.6MB,占掉预算的六分之一。

1080p 下主要附件的单帧字节量
图 1-67主要附件单帧字节量@ 本系列绘制
附件(1080p,约 207 万像素) 每像素字节 单帧字节 占 100MB 预算
颜色 RGBA8 4 B 约 8.3 MB 8.3%(读写各一次则 16.6%)
颜色 RGBA16F(HDR) 8 B 约 16.6 MB 16.6%
深度 24/32 位 3–4 B 约 6.2–8.3 MB 6–8%
深度 + 颜色(读写各一次) — 约 29–33 MB 近三分之一
4×MSAA 颜色(未解析) 16 B 约 33.2 MB 三分之一
各类附件配置的字节开销(相对 RGBA8 颜色)
图 1-68附件配置的预算占比@ 本系列绘制

用法很直接:下次有人问"移动端为什么不能随便开 HDR 和 MSAA",可以直接把这张表贴出来——不是"性能不够",是预算不够:颜色 + 深度 + HDR + 4×MSAA 叠起来,光附件就把每帧的字节预算吃掉大半,纹理采样还没开始算。

4.4.1 移动内存技术的演进

移动内存标准的代际演进
图 1-69移动内存的代际演进@ 本系列绘制
代际 每 pin 速率量级 相对前代的关注点
LPDDR3 800–2133 MT/s 普及低功耗内存
LPDDR4 / 4X 1600–4266 MT/s 速率提升,电压下调
LPDDR5 3200–6400 MT/s 更高带宽 + 链路能效优化
LPDDR5X 及之后 6400–8533 MT/s 及以上 带宽继续提升,能效与热成为主要约束

演进表要读出的不是"越来越快",而是"能效提升慢于带宽提升"——这正是本系列反复强调的那句话:算力与带宽的缩放不同步,而移动端的散热能力几乎没变。第 6 篇会展开这个趋势带来的后果。

纹理格式的每像素字节数对照
图 1-70纹理格式的字节对照@ 本系列绘制

4.5 实现与配置:降带宽的四类手段

移动 SoC 还有另一种存在形态——开发板与评估板。它们的带宽条件与手机不同(散热与供电充足),但内存子系统的结构与手机同源,因此常被用来做量化实验:

开发板实拍
图 1-71开发板实拍@ Wikimedia Commons · Thotypous (Paulo Matias)(CC BY-SA 3.0)
小型开发板
图 1-72小型开发板@ Wikimedia Commons · SparkFun Electronics from Boulder, USA(CC BY 2.0)
【纹理压缩格式选择 · 配置清单】

移动端首选:      ASTC      # 可变块尺寸(4x4 ~ 12x12),同一张图可按区域取不同压缩率
保守兼容:        ETC2      # 覆盖广,压缩率固定 4bpp
桌面移植:        BCn       # 移动端普遍不支持,跨平台项目需准备两套
未压缩:          仅用于特殊数据(如查找表)

典型压缩率收益:  压缩前 32bpp → 压缩后 4bpp,纹理带宽降为 1/8
【附件配置精简 · 配置清单】

1) RT 格式按需下调:      RGBA16F → RGBA8(仅在需要 HDR 中间结果时保留高精度)
2) RT 分辨率与显示分辨率解耦: 中间过程半分辨率(后处理链路常见)
3) MSAA 替代:            MSAA 2x/4x 换 FXAA/SMAA 类后处理 AA(代价是边缘质量的实现复杂度)
4) 附件语义:              load_op=CLEAR / store_op=DONT_CARE(不读不写)
5) 通道合并:              把多个中间结果打包进一张 RT 的不同通道
四类降带宽手段的作用位置
图 1-73降带宽手段的作用位置@ 本系列绘制

4.6 效果与量化:各项手段的收益量级

手段 收益量级 代价 适用条件
纹理压缩(ASTC 4bpp) 纹理带宽降至约 1/8 压缩伪影、编码时间 几乎所有纹理
附件语义精简 省掉整块附件的读写 需正确声明依赖 中间产物与瞬态附件
附件格式下调 与字节数成正比 精度/色带 非 HDR 中间结果
中间过程降分辨率 与像素数成正比(常见 1/4) 边缘质量 后处理链路
分块片上处理 深度/混合/瞬态附件不产生片外流量 片上内存容量限制 分块架构平台
减少 overdraw(HSR) 与重复着色比例成正比 无(硬件侧) TBDR 平台
各项降带宽手段的收益量级(相对量)
图 1-74降带宽手段的收益量级@ 本系列绘制

这里有一项必须单独标注口径的数字:学术研究中给出过"并行帧渲染(PFR)平均节省 23.8% 带宽,带来 12% 提速与 20.1% 省电"的实测结果 [Energy-Efficient Mobile GPU Systems]。这个数字很有价值,但它是特定机制在特定测试集上的结果,不能直接外推成"随便做点带宽优化就能省 20%"。本系列引用这类数字时会连同它的适用条件一起给出。

带宽受限时的排查顺序
图 1-75带宽受限处置顺序@ 本系列绘制

4.7 源码与数据链接

  • HPG,Mobile GPU approaches to power efficiency:https://highperformancegraphics.org/wp-content/uploads/2019/hot3d/mobile_gpu_power_and_performance.pdf
  • Arm,Mobile GPUs: Architecture, Constraints, and Optimization(SIGGRAPH 2024):https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/3858.siggraph_5F00_mmg_5F00_2024_5F00_Mobile101.pdf
  • Arm,Mobile HW and Bandwidth(SIGGRAPH 2015):https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_andy_2D00_slides.pdf
  • Qualcomm,Adreno GPU on Mobile: Best Practices:https://docs.qualcomm.com/doc/80-78185-2/topic/mobile_best_practices.html

4.8 这一章留下的问题

带宽账摊开了,但还有一笔更硬的账没算:即使你把带宽压到很低,功耗也可能照样撞墙。因为功耗不只来自内存访问,还来自频率、电压、以及那些看起来"没在干活"的空转与等待。下一章算这笔账,并解释一个现象:为什么同一台手机,跑分能到 60 帧,玩二十分钟却只有 40 帧。


三、功耗与热:帧率为什么会掉下去

5.1 一句话点题

先看看那个反常现象。这一章回答开篇那个反常的现象:为什么同一台手机,跑分能到 60 帧,玩二十分钟却只有 40 帧?

因为"能跑多快"由算力决定,"能跑多久"由散热能力与功耗预算决定。移动设备没有风扇,散热面积以平方厘米计,可持续散发的功率只有数瓦量级。一旦产生的热量超过这个上限,系统必然限频——而这与代码写得好不好无关。

5.2 原理与概念:整机的功耗预算

整机功耗的构成(相对量级示意)
图 1-76手机整机功耗的分配@ 本系列绘制

手机的功率预算不是一个数,而是一份分配方案。屏幕常常是最大的一项,SoC(含 CPU、GPU、NPU、内存控制器)是第二项,射频与摄像头瞬时功率也相当可观。这带来一个常被忽略的结论:优化渲染并不等于优化整机功耗——如果屏幕亮度拉满,渲染省下来的那点功率占比很小。

手机电池实拍
图 1-77手机电池实拍@ Wikimedia Commons · MKFI(Public domain)
电池另一面实拍
图 1-78电池另一面实拍@ Wikimedia Commons · MKFI(Public domain)
电池实拍
图 1-79电池实拍@ Wikimedia Commons · Raimond Spekking(CC BY-SA 4.0)
裸电芯实拍:软包形态与极耳
图 1-80裸电芯实拍:软包形态与极耳@ Wikimedia Commons · Shagett(CC BY-SA 4.0)
电池规格标签特写
图 1-81电池规格标签特写@ Wikimedia Commons · Dmitry G(CC BY-SA 3.0)

用电池反推一次功率上限就很直观:

【整机平均功率的粗算 · 伪代码】

电池能量 ≈ 容量(Ah) × 标称电压(V)     # 例如 4.5Ah × 3.85V ≈ 17.3 Wh
目标续航 = 6 小时
→ 整机平均功率 ≈ 17.3 Wh / 6 h ≈ 2.9 W

若游戏场景允许续航 2 小时:
→ 平均功率上限 ≈ 8.6 W(且这是整机,不是 SoC)

这个粗算解释了两件事:第一,为什么移动端的功耗预算这么紧——它由"电池容量 ÷ 期望续航"直接决定;第二,为什么持续性能必然低于峰值性能——峰值是"短时间借来的功率",而平均功率由散热与电池共同锁死。

移动端持续性能与关键实测比值
图 1-82爆发与持续性能落差@ 本系列绘制

关于这个落差,公开的实测统计给出的区间是:持续 GPU 性能大约只有短时峰值分数的 50%–65%(CPU 约 64%–78%),并且"5 分钟跑分赢的机器可能在 30 分钟持续负载里输给更慢的对手" [Smartphone Performance 实测统计]。这是本系列最该被记住的一个数字区间。

5.3 原理与概念:DVFS 与温度墙

DVFS 的调节闭环
图 1-83DVFS 的调节链路@ 本系列绘制

限频的机制叫动态频率电压调节(dynamic voltage and frequency scaling, DVFS)。它的逻辑是:芯片的动态功耗近似正比于频率乘以电压的平方,而高频需要更高电压,所以频率提高带来的功耗增长远快于性能增长。反过来,当温度逼近阈值时,降低频率是最有效的降温手段。

温度墙触发之后会发生什么,有一份可引用的实测记录:在一台具体机型上,持续负载约 4 分钟后 GPU 温度达到 48°C 并触发系统的图形限频机制(GPU_MITIGATION),频率从 900MHz 被直接降到 315MHz,同一任务的单次延迟从 130ms 升到 410ms [端侧推理功耗与热管理实测]。频率掉了约 65%,延迟涨了约 3.15 倍——性能的下降幅度比频率的下降幅度还大,因为降频同时降低了访存吞吐。

一次完整限频过程
图 1-84一次限频过程的时间线@ 本系列绘制

这里还有一个工程上很容易被忽略的细节:CPU 与 GPU 的降频通常不协同。移动热管理的研究记录过这样的过程:CPU 在 70°C 先触发限频,GPU 的频率"稍后才被驱动降低",两者不同步;受热惯性影响,CPU 降频之后温度仍继续爬到约 79°C [Cooperative CPU-GPU Thermal Management]。后果是性能下降的曲线不是平滑的,而是台阶式的、且带有滞后——这解释了玩家常说的"卡一下、好一点、又卡一下"。

CPU 与 GPU 降频的不协同(示意)
图 1-85CPU 与 GPU 的降频时序不协同@ 本系列绘制

5.4 参数逐项释义:与功耗相关的参数

参数 含义 典型取值/区间 谁在控制
频率(clock) GPU 的工作频率 数百 MHz 到 1.5GHz 量级 驱动/系统策略
电压(voltage) 与频率配套的供电电压 随频率档位变化 驱动/PMIC
温度阈值(thermal threshold) 触发限频的温度点 70°C 上下(依厂商策略) 系统固件
可持续功率(sustained power) 长时间可散发的功率 数瓦量级 机身设计与散热
爆发功率(burst power) 短时可借的功率 显著高于可持续 电池与供电
帧率上限 应用主动设定的上限 30 / 45 / 60 fps 开发者
热惯性(thermal inertia) 温度变化的滞后 秒到分钟级 物理(材料与结构)
与功耗相关的参数逐项释义
图 1-86功耗参数逐项释义表@ 本系列绘制

把这些参数逐项拆开,每一项对开发者的"可影响程度"差异很大:

频率与功耗的超线性关系(相对量)
图 1-87频率电压与功耗关系@ 本系列绘制
参数 谁在控制 开发者能做什么 不能做什么
频率 系统 DVFS 策略 通过降低负载间接影响 直接设定频率
电压 与频率档位配套 无 无
温度阈值 厂商固件 无 无(可查询热余量)
可持续功率 机身散热设计 通过降低持续功耗需求来"适应" 提高它
爆发功率 电池与供电设计 决定是否使用(不要依赖它) 延长它
帧率上限 开发者 直接设定功耗目标 —
热惯性 物理(材料与结构) 通过提前降档规避 消除它

表里只有一行是"开发者直接可控",就是帧率上限。这不是说其他手段无效,而是说:移动端的功耗优化本质上是"在给定的硬件与系统策略下,把负载曲线调到系统能长期承载的形状"——帧率上限是最直接的那个旋钮,附件与纹理的精简是间接降低单帧成本,而散热结构不由应用决定。

5.4.1 三条热设计经验法则

法则 内容 为什么
法则一 先设帧率上限,再谈画质 上限即功耗目标;不设上限等于把稳定性交给温控策略
法则二 画质档 = 功耗档,按机型分级 热量由功率决定,而不同机型的可持续功率差一个档位
法则三 把"连续 20 分钟不掉帧"写成验收指标 首次进入场景的帧率无法反映持续性
三种帧率策略的中长时段表现(相对量)
图 1-88三种帧率策略的对照@ 本系列绘制

三条法则里最反直觉的是第一条:设上限会让"最高帧率"变低,却会让"长期体验"变好。原因在于,超过可持续功率的那部分性能只能维持很短时间,之后必然以更低的水平偿还——而用户对"从 60 掉到 35"的感受,远差于"始终 45"。

5.4.2 不同机型的持续性能差异

不同机型档位的落差特征(示意)
图 1-89低中高三档机型对照@ 本系列绘制
机型档位 峰值表现 持续表现 落差特征 优化重点
低端 低 低但稳定 落差小 减负:先把画质降到可持续水平
中端 中 约为峰值的六成 落差中等 平衡:分级画质档 + 帧率上限
高端 高 约为峰值的一半 落差最大 收着用:避免"峰值思维"导致的后期崩落

这张表解释了一个常见的产品现象:高端机型在长时间游戏中的"掉帧感"往往比中端机型更明显——不是因为它更差,而是因为它前段借了更多功率,后段要还得更多。这也提醒我们:性能测试必须覆盖持续态,否则会系统性地偏向高端机型。

5.5 实现与配置:把"可持续"当成设计目标

按变体 B,这里给配置清单与决策规则,而不是长代码。

【以可持续为目标的三条配置规则 · 配置清单】

规则 1: 主动设帧率上限,而不是"能跑多高跑多高"
        reasoning: 帧率上限直接设定功耗目标;跑满峰值 = 提前撞温度墙
        例: 目标 45fps 稳定,优于 60fps 掉到 35fps(体验与发热都更好)

规则 2: 按机型区间分级设置(画质档 = 功耗档)
        低端: 降分辨率 + 关 HDR + 简化后处理
        中端: 保持分辨率 + 精简后处理链
        高端: 完整链路,但仍设帧率上限

规则 3: 把"连续 20 分钟不掉帧"写成验收指标
        而不是"首次进入场景的帧率"

这三种取向没有绝对优劣,取决于产品定位。但"不设上限、期待它自己稳"一定是最差的选择:它把稳定性交给了温控策略,而策略的抖动是用户能直接感觉到的。

【散热侧的可做与不可做 · 配置清单】

开发者可直接做:   降低持续功率需求(帧率上限、画质档分级)
                  避免"无意义的高负载"(空转的渲染、过度提交)
设备侧决定:       均热板 / 石墨片 / 机身结构散热 / 温度阈值
应用可感知:       系统温度状态(部分平台可读)→ 提前降档而不是被动掉帧

5.6 效果与量化:功耗优化的收益与代价

手段 收益 代价 备注
设帧率上限(60 → 45) 持续功率显著下降,稳定性提升 直接损失流畅度上限 换取长时稳定,通常划算
降低渲染分辨率 功耗近似随像素数下降 画质下降 与带宽收益叠加
减少 CPU/GPU 同步等待 单位功耗产出提高 需要重构提交结构 常被忽略的一项
分级画质档 覆盖不同散热能力的机型 需要多套配置与测试 工程量大但收效稳
主动读取温度状态并降档 避免被动掉帧的抖动 需要平台支持 体验提升明显
设帧率上限前后的功耗与稳定性(示意)
图 1-90设帧率上限前后对照@ 本系列绘制

两个公开的工程案例可以佐证这套做法确实有效:

案例一(自适应降档):Kakao Games 在其手游上接入 Android 自适应功能(含 ADPF 热 API 与 Unity Adaptive Performance)之后,FPS 稳定性提升到 96%——注意这个指标不是"平均帧率提高",而是"帧率更稳",正符合本节主张的以稳定性为目标的思路 [Android Developer Stories]。

案例二(定位发热源):一个 Unity 手游项目在骁龙 888 机型上跑 8 分钟后触发限频,GPU 频率从 840MHz 掉到 520MHz;用帧调试器与 Snapdragon Profiler 定位后发现三个主要热源,其中透明的粒子系统带来 4.2 倍的 overdraw,减少 60% 粒子并改用 GPU 实例化后缓解 [移动端散热限频实测案例]。这个案例里有两点值得记住:一是"8 分钟"而不是"立刻",说明短测发现不了问题;二是热源是透明粒子,而不是"渲染太复杂"这种笼统判断。

热量离开 SoC 之后的路径
图 1-91散热路径示意@ 本系列绘制

散热结构本身属于设备侧,但理解它对开发者的意义在于:它决定了"可持续功率"这个上限值,而你的任务是让功耗需求低于这个上限。

热成像实拍
图 1-92热成像实拍@ Wikimedia Commons · Srnec media(CC BY-SA 4.0)
带热像仪的手机实拍
图 1-93带热像仪的手机实拍@ Wikimedia Commons · Maurizio Pesce from Milan, Italia(CC BY 2.0)
散热结构实拍
图 1-94散热结构实拍@ Wikimedia Commons · Hans Haase(CC BY-SA 4.0)
冷却板与导热材料
图 1-95冷却板与导热材料@ Wikimedia Commons · Steve Jurvetson from Los Altos, USA(CC BY 2.0)

把这四张放在一起看,热量路径就很具体了:从 SoC 结温出发,经封装与导热界面材料传到均热板或冷却板,再通过中框扩散到机身表面。任何一个环节热阻偏高,可持续功率都会提前撞墙。代价也不只是掉帧——下面这块鼓包的锂聚合物电池,留下的是不可逆的物理损伤。

鼓包的锂聚合物电池实拍
图 1-96鼓包的锂聚合物电池实拍@ Wikimedia Commons · Stemoc(CC0)
主动降档的流程
图 1-97读热余量主动降档流程@ 本系列绘制
续航目标与平均功率的换算
图 1-98续航目标与功率换算@ 本系列绘制

5.7 源码与数据链接

  • Improving Mobile Gaming Performance through Cooperative CPU-GPU Thermal Management(热管理协同与温度阈值实测):https://ces.itec.kit.edu/img/Improving_Mobile_Gaming_Performance_through_Cooperative_CPU_GPU_Thermal_Management.pdf
  • 端侧推理的功耗与热管理全链路(限频实测:900→315MHz):https://xckevin.com/blog/2025-11-21-%E6%B7%B1%E5%85%A5_android_%E7%AB%AF%E4%BE%A7_ai_%E6%8E%A8%E7%90%86%E7%9A%84%E5%8A%9F%E8%80%97%E4%B8%8E%E7%83%AD%E7%AE%A1%E7%90%86%E5%85%A8%E9%93%BE%E8%B7%AF_%E4%BB%8E_soc_dvfs_%E8%B0%83%E5%BA%A6%E5%88%B0_therm/
  • Smartphone Performance: The Complete Physics Guide(持续性能区间统计):https://product.ai/truth-graph/smartphones/performance/
  • LLM Inference at the Edge(DVFS 与结温阈值的机制说明):https://arxiv.org/html/2603.23640v1
  • Energy-Efficient Mobile GPU Systems(并行帧渲染的带宽/能耗收益):https://pdfs.semanticscholar.org/d9a1/8a89784bb60aee829866853b502c2872000c.pdf

5.8 这一章留下的问题

到这里,两道墙都立起来了:带宽决定"一帧能搬多少字节",功耗与散热决定"这些字节能以多快的速度、持续多久被搬"。但还有一个问题没有回答——知道约束之后,具体该怎么做?下一章把约束转成可执行的判断规则与测量方法,并说明怎么证明你的优化真的有效。


四、工程实践与测量:怎么证明你真的优化了

6.1 一句话点题

先看看工程侧要回答什么。这一章回答:知道约束是一回事,怎么把它落到工程决策上、又怎么证明自己没白干,是另一回事。

这一章给三层内容:引擎侧的第一层配置、约束转成判据的几条规则、以及一套可复现的测量协议。最后一项最重要——移动端没有测量就没有优化,"感觉变快了"在温控抖动面前毫无意义。

6.2 原理与概念:引擎侧的第一层应对

引擎的官方文档其实已经给了一份清单,只是没解释为什么。以 Unity 的 URP 文档为例:关掉 Depth Texture、Opaque Texture、Use Rendering Layers、HDR 与 LOD Cross Fade,Additional Lights 降到 Per Vertex [Unity URP 性能配置文档]。放回前两章的账本里看,每一项都对应一笔具体的流量或算力开销——它不是「经验之谈」,而是物理约束在配置项上的投影。

引擎侧常见开关与它的物理原因
图 1-99引擎开关与物理原因@ 本系列绘制

把每个开关翻译成物理原因,就能理解为什么这份清单长这样:

开关 省的是什么 为什么
关闭 Depth Texture 一张全分辨率深度附件的读写 不用就不该生成
关闭 Opaque Texture 一次全场景快照的拷贝 这是典型的"多出来的一趟全屏流量"
关闭 HDR 附件每像素字节数减半 RGBA16F → RGBA8
关闭 Rendering Layers 少一张渲染目标 额外的附件 = 额外的带宽
关闭 LOD Cross Fade 过渡期的额外混合与采样 alpha 混合与阴影采样都变贵
Additional Lights 设 Per Vertex 逐像素光照次数下降 光照是逐像素的成倍开销
引擎编辑器界面实拍
图 1-100引擎编辑器界面实拍@ Wikimedia Commons · AfterCadaver(CC BY-SA 4.0)

6.3 约束转成判据:四条判断规则

这一节把前面立下的约束收成四条判断规则。用法是反过来的:不是先挑手段,而是先从现象判断瓶颈在哪,再决定动哪一层——顺序错了,优化就会做在最不该做的地方。

从现象定位瓶颈到选择手段
图 1-101约束到决策的判断流程@ 本系列绘制
现象 大概率瓶颈 首选手段 不应先做
降低分辨率后帧率显著上升 带宽或像素填充率 降中间过程分辨率、精简附件 先优化着色器算法
着色器复杂度减半但帧率几乎不动 带宽 纹理压缩、附件语义、减少 RT 继续优化算力
前 5 分钟稳、之后掉帧 热与功耗 设帧率上限、分级画质档 继续加效果
帧率方差大、偶发卡顿 CPU/GPU 同步与提交 减少状态切换与同步点 只看平均帧率
降低渲染分辨率的收益(相对量示意)
图 1-102降分辨率的收益曲线@ 本系列绘制

6.4 参数逐项释义:测量协议里的参数

测量协议里的每一个参数都对应一类会污染结论的误差来源,所以它们不是随手定的。下表先给一份可以直接照用的取值,随后逐项说明每个取值背后的用意,以及它对应的是哪一类误差。

参数 含义 建议取值 为什么
预热时长 开始计时前先跑多久 ≥3 分钟(或至温度稳定) 避开爆发性能,测的是可持续性能
测量时长 正式取样时长 ≥10 分钟 覆盖限频发生与再平衡
取样间隔 多久记一次数据 1 秒或更细 捕捉台阶式下降
记录指标 除平均帧率外还记什么 帧时间分布、1% low、SoC 温度 平均值会掩盖卡顿
环境温度 测试环境 恒温或记录实测 温度结论强依赖环境温度
机型分级 覆盖哪些区间 至少低/中/高三档 单机型结论不可外推
测量协议的参数取值与理由
图 1-103测量协议参数释义@ 本系列绘制

逐项拆开,每个取值背后都有具体的用意:

参数 取值偏小的后果 取值偏大的代价 建议
预热时长 测到爆发性能,高估 测试时间变长 ≥3 分钟或至温度稳定
测量时长 未覆盖限频与再平衡 同上 ≥10 分钟
取样间隔 漏掉台阶式下降 数据量膨胀 1 秒或更细
记录指标 平均值掩盖卡顿 分析复杂度上升 加记帧时间分布与 1% low
环境温度 结论不可复现 需恒温设备 恒温或明确记录
机型分级 结论无法外推 机型数量增加 至少低/中/高三档

6.4.1 测量数据怎么读

拿到数据之后,最常犯的三个解读错误:

解读错误 表现 正确的读法
只看平均帧率 两台设备平均值相同,体验差别大 同看 1% low 与帧时间标准差
把"稳定"当"平" 曲线平但有周期性尖峰 看帧时间的分布形状,而不只是走势
把首段数据当结论 前 30 秒最亮眼 以稳定态区间为结论,首段只作参考
怎么判定进入了稳定态(示意)
图 1-104稳定态判定@ 本系列绘制

"稳定态帧率 / 峰值帧率"这个比值,才是衡量移动端性能最该写进报告的指标。它同时反映了散热设计、温控策略与应用负载三者的匹配程度,而这三个因素恰好是移动端性能的全部。

测量工具的分工
图 1-105测量工具的分工表@ 本系列绘制

6.5 实现与配置:一套可复现的测量流程

【可持续性能测试协议 · 伪代码】

阶段 1  冷机 → 记录起始温度
阶段 2  预热 3 分钟(同一场景、同一画质档)→ 丢弃这段数据
阶段 3  正式取样 10 分钟
        每次记录: 帧时间 / SoC 温度 / GPU 频率 / 内存占用
阶段 4  计算:
        平均帧率、1% low、帧时间标准差
        达到稳定态的时间(从开始到帧率曲线变平)
        稳定态帧率 / 峰值帧率  ← 这个比值才是"持续性"指标
阶段 5  同一协议在低/中/高三档机型各跑一遍
【测量工具的分工 · 配置清单】

抓帧分析:   逐 draw 的耗时与状态(定位单帧问题)
系统级监测: 帧率、温度、频率的时间序列(定位持续性问题)
功耗测量:   外接功率分析仪(整机功率,最可信)
            注意: 设备自报功耗通常不含屏幕与供电损耗
功率分析仪实拍
图 1-106功率分析仪实拍@ Wikimedia Commons · Tiia Monto(CC BY-SA 3.0)
另一类功率分析设备
图 1-107另一类功率分析设备@ Wikimedia Commons · dfrolov(CC BY-SA 4.0)
便携分析仪器
图 1-108便携分析仪器@ Wikimedia Commons · Dtwitkowski(CC BY-SA 3.0)
数字示波器实拍
图 1-109数字示波器实拍@ Wikimedia Commons · BekundaOff(CC BY 4.0)

6.6 效果与量化:常见测量错误与代价

测量这件事,错法往往比正法多,而且每种错法都给出一个「看起来很有道理」的错结论。下表把五种常见错误、导致的错结论与正确做法并排列出;后三张图对应最容易踩的三处。

错误做法 会得出什么错结论 正确做法
冷机跑 1 分钟取平均 高估 40%–100%(取决于机型) 预热后测,或明确标注"爆发性能"
只看平均帧率 忽略卡顿(1% low 可能很差) 同时看帧时间分布与 1% low
在室温波动大的环境测 温度结论不可复现 恒温环境或记录环境温度
单机型得出"优化有效" 无法外推到其他档位 至少三档机型
用设备自报功耗 低估真实整机功耗 外接功率分析仪校准
预热与不预热的结论差异(示意)
图 1-110预热与否的曲线差异@ 本系列绘制
优化前后对照实验的设计要点
图 1-111优化前后的对照实验@ 本系列绘制
提交结论前必须确认的八项
图 1-112测量自查清单@ 本系列绘制

6.7 源码与数据链接

  • Unity URP,Configure for better performance:https://docs.unity3d.com/6/Documentation/Manual/urp/configure-for-better-performance.html
  • Unity URP 中文版(同上,术语对照):https://docs.unity.cn/cn/Packages-cn/com.unity.render-pipelines.universal@14.1/manual/configure-for-better-performance.html
  • Qualcomm,Adreno GPU on Mobile: Best Practices:https://docs.qualcomm.com/doc/80-78185-2/topic/mobile_best_practices.html
  • Arm,Getting started on mobile and best practices for Arm GPUs:https://vulkan.org/user/pages/09.events/vulkanised-2023/vulkanised_2023_getting_started_on_mobile_and_best_practices_for_arm_gpus.pdf

6.8 这一章留下的问题

言归正传,约束、机制、账本、测量都讲完了,但这一篇始终没有回答一个更尖锐的问题:在这两道墙之下,哪些"高级效果"仍然值得做?延迟着色、屏幕空间反射、体积光这些桌面上的常客,在移动端是"换个做法就能用"还是"根本不该用"?这是第 5 篇的主题,也是本系列从"前提"转向"取舍"的转折点。


五、结语:把前提立住,把问题交出去

7.1 回到那条主线

依然是先来看看七篇怎么互相关联。把知识地图展开成一张依赖关系表,大家按自己的需要跳读:

七篇的依赖并不重:除第 1 篇人人可读外,其余各篇几乎只依赖前面的某一两篇,跳读也没问题。下面用一张表把每篇的前置依赖标清楚。

篇 前置依赖 可独立阅读 适合大家
1 物理约束(本篇) 无 是 所有人
2 分块渲染 第 1 篇 部分 引擎与底层开发者
3 带宽 第 1、2 篇 部分 性能优化工程师
4 功耗与热 第 1 篇 部分 产品与性能负责人
5 延迟着色取舍 第 1–4 篇 否 渲染架构与美术技术
6 现代特性 第 1–5 篇 否 追赶前沿的开发者
7 测量与调优 第 1 篇 是 所有人(尤其是测试)

这一篇通篇只在做一件事:把移动端图形的物理前提立起来。我们会得出一条主线:现象(同一份代码两种命运)→ 约束(带宽墙与功耗墙)→ 机制(分块架构为什么这样设计)→ 账本(每帧字节与每瓦产出)→ 判据(怎么选手段)→ 验证(怎么证明有效)。

本篇量化结论汇总
图 1-113本篇量化结论汇总表@ 本系列绘制

本篇的量化结论汇总(每条都标注了出处,方便核对):

结论 数值 来源类型
持续 GPU 性能 / 爆发性能 50%–65% 公开实测统计
CPU 持续性能 / 爆发性能 64%–78% 同上
一次限频实测:频率下降 900MHz → 315MHz(约 −65%) 单机型实测记录
同一次限频:单次任务延迟 130ms → 410ms(约 3.15×) 同上
CPU 触发限频的典型温度 70°C 上下,GPU 随后且不协同 学术研究
LPDDR vs GDDR 每 pin 带宽 不到一半 HPG 会议材料
LPDDR 峰值能效优势 约 10% 同上
DRAM 访问功耗代价 约 80–100mW per GB/s 移动 GPU 功耗建模论文
典型内存功率预算下的每帧可搬字节 约 100MB(60fps、650mW 预算) 同上
并行帧渲染的收益 带宽 −23.8% → 提速 12%、省电 20.1% 学位论文实测
三角形丢弃(遮挡几何预测)的收益 平均省电 14.5%(其中 11.7% 来自内存系统) ACM 论文
VRS 在移动端的实测收益 平均帧率提升约 12%–13% 厂商开发者文档

这里面有两条数字值得单独记住,因为它们把"约束"从形容词变成了可算的量:

第一条:DRAM 访问的功耗代价约为每 GB/s 80–100mW,而在典型的内存功率预算(约 650mW)下,60fps 每秒只能搬运约 100MB/帧的等价值 [移动 GPU 功耗建模]。这意味着"每帧能用多少字节"是可以算出来的——不是感觉上的"带宽紧张"。

第二条:持续性能只有峰值的 50%–65%。这条决定了移动端的性能设计必须以"持续"为目标,而不是以"峰值"为目标。

7.2 三个还没解决的问题

按惯例,讲结束时要把仍然敞开的口子列清楚,而不是假装都解决了。

三个还没解决的问题
图 1-114三个未解问题@ 本系列绘制
  1. 限频策略不可见、不可预测。厂商温控策略不公开,开发者只能拿到"已经降频了"这个结果。Android 的动态性能框架(ADPF)给出热余量查询接口,让应用能在不可持续之前主动降负载,这是目前最接近"提前知道"的手段 [Android ADPF 文档];但它给的是余量,不是曲线。
  2. 跨机型外推依然困难。同一个优化在中端机上收益 20%、在高端机上可能只有 3%(因为它本来就不在带宽瓶颈上)。"优化收益取决于当前瓶颈在哪"这件事,目前只能逐机型实测。
  3. 功耗与画质的最优点依赖产品定位。竞技类游戏与叙事类游戏的取舍完全不同,这不是技术问题,是产品问题——技术能做的是把取舍曲线画清楚,让人知道每个选择的代价。

7.3 选型建议:什么时候该为移动端单独设计

给一条可操作的判断路径。入口是四个维度:目标机型区间、画质要求、续航要求、团队能力——任何一个落在下半个区间,共用一套管线都会在持续性能上付代价。

要不要为移动端单独设计
图 1-115移动端单独设计决策树@ 本系列绘制
判断条件 若成立 建议
目标机型覆盖中低端 是 必须单独设计:带宽与散热上限差一个档位
要求连续 30 分钟不掉帧 是 必须单独设计:峰值优化在这里无效
画质目标是"接近主机/PC" 是 单独立项:需要另一条画质档链路
只面向少数高端机型 是 可以先共用管线,但必须单独做持续性能验收
团队无法维护两套配置 — 至少做"分级画质档 + 帧率上限"两条最小干预

7.4 下一篇预告与系列进度

系列刚从首篇起步,立完前提,下一篇就该进入机制层了。

下一篇是【移动端图形与功耗】(二)分块渲染:binning、片上内存与它的代价。它会把这一篇立下的第一道墙(带宽)拆到机制层:binning 阶段到底在做什么、片上内存能挂多少附件、什么时候会溢出到系统内存、"零带宽"的成立条件与失效条件各是什么,以及这些机制在三个平台上(Arm / Imagination / Qualcomm / Apple)的具体差异。

如果你只想知道"该怎么配",第 2 篇与第 4 篇是最实用的两篇;如果你在做架构选型,第 5 篇(延迟着色取舍)与第 6 篇(现代特性)更相关。

7.5 一点点题外话

移动端图形这个方向的写作有个尴尬之处:它的结论往往不如桌面端"漂亮"。很多取舍的答案是"看情况"——看机型、看画质目标、看续航要求。但这不是含糊,而是这个领域真实的样子:约束越多的地方,最优解越依赖上下文。

我们能做的是把上下文写清楚:哪些量是硬的(位宽、热阻、温度阈值),哪些是软的(画质偏好、帧率目标),以及每个选择的代价落在哪。把这件事做到位,比给一份"最佳实践清单"更有用——因为清单会过期,而约束不会。

7.6 落款

本篇是《移动端图形与功耗》系列的第 1 篇。写作过程中,凡是引用第三方数据的地方都给了出处,凡是"机制上如此"的判断都没有伪装成实测结论;拿不到数据的地方,我们选择留白而不是填空。如果大家发现任何一处口径不一致或引用错误,欢迎指出——技术文章的信誉就建立在"数字能核对"这一点上。


参考文献

官方文档与权威资料(1–34)

  1. Arm,Getting started on mobile and best practices for Arm GPUs(Vulkanised 2023)— https://vulkan.org/user/pages/09.events/vulkanised-2023/vulkanised_2023_getting_started_on_mobile_and_best_practices_for_arm_gpus.pdf
  2. Arm,Mobile HW and Bandwidth(SIGGRAPH 2015)— https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_andy_2D00_slides.pdf
  3. Arm,Vulkan on mobile(SIGGRAPH 2020)— https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/2_2D00_mmg2020_2D00_vulkan_2D00_emilio.pdf
  4. Arm,Mobile GPUs: Architecture, Constraints, and Optimization(SIGGRAPH 2024)— https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/3858.siggraph_5F00_mmg_5F00_2024_5F00_Mobile101.pdf
  5. Arm,Performance Studio(性能分析工具套件)— https://www.arm.com/products/development-tools/graphics/arm-performance-studio
  6. Imagination,PowerVR Graphics Architecture — https://www.imaginationtech.com/products/gpu/graphics-architecture/
  7. Imagination,Hidden Surface Removal Efficiency — https://docs.imgtec.com/starter-guides/powervr-architecture/html/topics/hidden-surface-removal-efficiency.html
  8. Qualcomm,Adreno GPU Game Developer Guide · Overview — https://docs.qualcomm.com/doc/80-78185-2/topic/overview.html
  9. Qualcomm,Adreno GPU on Mobile: Best Practices — https://docs.qualcomm.com/doc/80-78185-2/topic/mobile_best_practices.html
  10. Qualcomm,Snapdragon Profiler — https://www.qualcomm.com/developer/software/snapdragon-profiler
  11. Qualcomm,Snapdragon Profiler User Guide — https://developer.qualcomm.com/qfile/71530/snapdragon_profiler_user_guide.pdf
  12. Apple,Tailor your apps for Apple GPUs and tile-based deferred rendering — https://developer.apple.com/documentation/Metal/tailor-your-apps-for-apple-gpus-and-tile-based-deferred-rendering
  13. Apple,Rendering a scene with deferred lighting in Swift — https://developer.apple.com/documentation/metal/rendering-a-scene-with-deferred-lighting-in-swift
  14. Apple,Capturing a Metal workload in Xcode — https://developer.apple.com/documentation/Xcode/Capturing-a-Metal-workload-in-Xcode
  15. Apple,Modern Rendering with Metal(WWDC19)— https://devstreaming-cdn.apple.com/videos/wwdc/2019/601fthb9otw94fg/601/601_modern_rendering_with_metal.pdf
  16. Khronos,Tile Based Rendering (TBR) Best Practices(Vulkan Guide)— https://docs.vulkan.org/guide/latest/tile_based_rendering_best_practices.html
  17. Khronos,Mobile Development: Rendering Approaches(Vulkan Tutorial)— https://docs.vulkan.org/tutorial/latest/Building_a_Simple_Engine/Mobile_Development/04_rendering_approaches.html
  18. Khronos,VK_EXT_multisampled_render_to_single_sampled — https://docs.vulkan.org/features/latest/features/proposals/VK_EXT_multisampled_render_to_single_sampled.html
  19. Khronos 社区,Tile Based Rendering Best Practices 讨论 — https://community.khronos.org/t/tile-based-rendering-best-practices/112538
  20. Khronos,Vulkan Spec 深度相关章节(Vulkan Guide · Depth)— https://docs.vulkan.org/guide/latest/depth.html
  21. Godot,Internal rendering architecture — https://docs.godotengine.org/en/4.3/contributing/development/core_and_modules/internal_rendering_architecture.html
  22. Godot,GPU optimization(tile renderer 与带宽)— https://docs.godotengine.org/ru/4.5/_sources/tutorials/performance/gpu_optimization.rst.txt
  23. Godot,Mobile rendering limitations(移动端逐顶点光照等)— https://godot-ru.readthedocs.io/ru/3.x/_sources/tutorials/platform/mobile_rendering_limitations.rst.txt
  24. Godot,4.5 Release Notes(Fragment Density Map 与 Vulkan Mobile 的注视点渲染)— https://godotengine.org/releases/4.5/
  25. Godot QA,移动端性能优化经验讨论 — https://godotengine.org/qa/57294/looking-for-some-tips-to-speed-up-my-game
  26. Unity,Configure for better performance(URP)— https://docs.unity3d.com/6/Documentation/Manual/urp/configure-for-better-performance.html
  27. Unity(中文),配置 URP 以获得更好的性能 — https://docs.unity.cn/cn/Packages-cn/com.unity.render-pipelines.universal@14.1/manual/configure-for-better-performance.html
  28. Android,Thermal API(ADPF 热余量查询)— https://developer.android.com/games/optimize/adpf/thermal
  29. Android,Adaptive Performance Framework 总览 — https://developer.android.google.cn/games/optimize/adpf
  30. Android,Slow sessions(可持续性能监测)— https://developer.android.google.cn/games/optimize/vitals/slow-session
  31. Samsung,Adaptive Performance in Call of Duty Mobile(热状态 API 实践)— https://developer.samsung.com/galaxy-gamedev/gamedev-blog/cod.html
  32. Samsung,Using Variable Rate Shading to Improve Performance on Mobile Games — https://developer.samsung.com/galaxy-gamedev/blog/en-us/2022/11/22/using-variable-rate-shading-to-improve-performance-on-mobile-games
  33. MediaTek,VRS 开发示例(移动端实测帧率)— https://developer.mediatek.com/VariableRateShading/642428c3f55b040d6989a991.html
  34. NVIDIA,VRWorks – Variable Rate Shading — https://developer.nvidia.com/vrworks/graphics/variablerateshading

学术研究与量化材料(35–46)

  1. Improving Mobile Gaming Performance through Cooperative CPU-GPU Thermal Management(KIT)— https://ces.itec.kit.edu/img/Improving_Mobile_Gaming_Performance_through_Cooperative_CPU_GPU_Thermal_Management.pdf
  2. Mobile GPU approaches to power efficiency(HPG 2019)— https://highperformancegraphics.org/wp-content/uploads/2019/hot3d/mobile_gpu_power_and_performance.pdf
  3. Energy-Efficient Mobile GPU Systems(学位论文,并行帧渲染的带宽与能耗收益)— https://core.ac.uk/download/33348056.pdf
  4. Automated PMC-based Power Modeling Methodology for Modern Mobile GPUs(DRAM 每 GB/s 功耗与内存功率预算)— https://arxiv.org/pdf/2408.04886v1
  5. Triangle Dropping: An Occluded-geometry Predictor for Energy-efficient Mobile GPUs(ACM)— https://dl.acm.org/doi/fullHtml/10.1145/3527861
  6. Perceptual Model for Adaptive Local Shading and Refresh Rate(ACM,VRS 的 16×16 分块)— https://dl.acm.org/doi/pdf/10.1145/3478513.3480514
  7. A QoS-Aware Memory Controller for Dynamically Balancing GPU and CPU Bandwidth Use in an MPSoC(分块渲染的片上缓存机制)— http://lph.ece.utexas.edu/users/mjeong/pubs/cpugpumc_dac12.pdf
  8. LLM Inference at the Edge: Mobile, NPU, and GPU Performance Efficiency Trade-offs Under Sustained Load(DVFS 与结温阈值)— https://arxiv.org/html/2603.23640v1
  9. RTGS: Enabling Real-Time Gaussian Splatting on Mobile Devices Using Efficiency-Guided Pruning and Foveated Rendering — https://arxiv.org/html/2407.00435v2
  10. Resource utilization of different mobile platforms under sustained inference — https://arxiv.org/html/2410.05315
  11. OpenCL Optimization and Best Practices for Qualcomm Adreno GPUs(SP 内部结构)— https://dl.acm.org/doi/pdf/10.1145/3204919.3204935
  12. Smartphone Performance: The Complete Physics Guide(持续性能区间统计)— https://product.ai/truth-graph/smartphones/performance/

工程实践与社区讨论(47–62)

  1. 端侧推理的功耗与热管理全链路:从 SoC DVFS 调度到 Thermal Throttling(限频实测 900→315MHz)— https://xckevin.com/blog/2025-11-21-
  2. Mobile Performance Deep Dive(移动端分析工具分工)— https://getperfguard.com/tutorials/mobile-performance
  3. Foveated Rendering Strategies for Power-Constrained Mobile XR(VRS 与注视点渲染的工程取舍)— https://beefed.ai/en/foveated-rendering-mobile-xr-best-practices
  4. Arm Mali GPU 最佳实践(中文翻译)— https://blog.csdn.net/ZJU_fish1996/article/details/129095365
  5. 解密手机 GPU:硬件架构、渲染机制与手游开发的性能突围 — https://blog.csdn.net/qq_33060405/article/details/151753314
  6. 技术美术百人计划 · 3.7 移动端 GPU 的 TB(D)R 架构(笔记)— https://blog.csdn.net/qq_53352162/article/details/141563720
  7. 揭秘 TBR 渲染架构:移动图形的心脏(Imgtec 社区)— https://imgtec.eetrend.com/blog/2026/100598386.html
  8. 带宽:GPU 的粮道在哪里堵住了(DRAM 维持功耗与未命中代价)— https://blog.csdn.net/qq_45370022/article/details/164295496
  9. GPU 性能优化全指南:从诊断到实战(纹理压缩格式对照)— https://blog.csdn.net/qq_33060405/article/details/148148889
  10. Metal2 剖析(二):传统延迟渲染和 TBDR — https://blog.csdn.net/cordova/article/details/102944905
  11. Vulkan 入门(7):渲染过程与附件描述 — https://blog.csdn.net/u014535072/article/details/115278337
  12. TBDR ってなんだ?〜Apple GPU の心臓部「タイルベース遅延レンダリング」を完全理解〜 — https://qiita.com/GeneLab_999/items/af98cd50e9e117a29ed7
  13. Apple Silicon TBDR: What App Developers Actually Get — https://blakecrosley.com/blog/apple-silicon-tbdr
  14. 分块延迟渲染架构能否在桌面领域立足(几何压缩与剔除策略)— https://blog.csdn.net/weixin_49393016/article/details/155230945
  15. TBDR 架构为什么特别适合手机 GPU(片上内存与两阶段流程)— https://wenku.csdn.net/answer/3xp49m0nshg2
  16. POWERVR GPU IP core family(TA / ISP / TSP 三段流水)— http://cs.nju.edu.cn/swang/CompArchOrg_11F/project/P1/P3-PowerVR.pdf

硬件媒体与拆解报告(63–68)

  1. 3nm 芯片们,亮剑(骁龙 8 Elite 裸片与版图分析)— https://www.icviews.cn/news/14907/7
  2. 三款 3nm 旗舰手机,深度拆解 — http://news.qq.com/rain/a/20260226A062PN00
  3. 天玑 9000 die shot 分析 — https://ask.zol.com.cn/x/33329964.html
  4. 拆解小米 15s Pro:玄戒 O1 的 GPU 面积与缓存配置 — https://www.eet-china.com/news/202505233807.html
  5. 日机构拆解中国最新智能手机发现的自研芯片 — https://www.eet-china.com/news/202302026677.html
  6. AMD Radeon RX 6650M Mobile Graphics(移动独显的功耗与带宽规格对照)— https://www.amd.com/en/products/graphics/amd-radeon-rx-6650m

素材来源(69–78,逐张登记见「图片版权」一节)

  1. Wikimedia Commons,Category:Thermal imaging cameras — https://commons.wikimedia.org/wiki/Category:Thermal_imaging_cameras
  2. Wikimedia Commons,Category:System on a chip — https://commons.wikimedia.org/wiki/Category:System_on_a_chip
  3. Wikimedia Commons,Category:Graphics processing units — https://commons.wikimedia.org/wiki/Category:Graphics_processing_units
  4. Wikimedia Commons,CAT-B25 主板四视图(主板实拍)— https://commons.wikimedia.org/wiki/File:CAT-B25-Motherboard-Front-FL.jpg
  5. Wikimedia Commons,LG VN251S Motherboard Front — https://commons.wikimedia.org/wiki/File:LG_VN251S_Motherboard_Front.jpg
  6. Wikimedia Commons,SIP integrated circuits package — https://commons.wikimedia.org/wiki/File:SIP_integrated_circuits_package.jpg
  7. Wikimedia Commons,SN76489AN die shot(CC0 裸片)— https://commons.wikimedia.org/wiki/File:SN76489AN_die_shot.png
  8. Wikimedia Commons,Samsung Galaxy Nexus battery(电池实拍)— https://commons.wikimedia.org/wiki/File:Samsung_Galaxy_Nexus_battery_1.JPG
  9. Wikimedia Commons,Hioki 3390 Power analyzer(功率分析仪)— https://commons.wikimedia.org/wiki/File:Hioki_3390_Power_analyzer.jpg
  10. Wikimedia Commons,3D-Pipeline.svg(CC0 图形管线图)— https://commons.wikimedia.org/wiki/File:3D-Pipeline.svg

工程案例与测量方法(79–90)

  1. Android Developer Stories,Kakao Games 通过自适应功能将 FPS 稳定性提升至 96% — https://developer.android.com/stories/games/kakaogames-adaptability
  2. Unity Blog,Higher fidelity and smoother frame rates with Adaptive Performance(Megacity / Galaxy S10 对照)— https://blog.unity.com/technology/higher-fidelity-and-smoother-frame-rates-with-adaptive-performance
  3. Unity,Adaptive Performance 示例指南(热状态事件难以触发的原因)— https://docs.unity.cn/Packages/com.unity.adaptiveperformance@4.0/manual/samples-guide.html
  4. Ocean View Games,Managing Thermal Throttling in Unity Mobile Games — https://oceanviewgames.co.uk/blog/posts/managing-thermal-throttling-unity-mobile
  5. 移动端实测案例:散热限频与 Overdraw 排查(840MHz → 520MHz,粒子 4.2× overdraw)— https://dredyson.com/the-hidden-truth-about-hardware-control-patterns-from-a-12v-heater-thread-what-every-senior-game-developer-needs-to-know-for-aaa-performance-optimization-in-unreal-engine-and-unity/
  6. Unity 移动端 Overdraw 优化指南:从 GPU 原理到发热掉帧排查 — https://blog.csdn.net/weixin_29007135/article/details/164386353
  7. Apple,Optimize Metal apps and games with GPU counters(overdraw 的计数器定义)— https://developer.apple.com/videos/play/wwdc2020/10603
  8. J. Arnau 等,Eliminating Redundant Fragment Shader Executions on a Mobile GPU via Hardware Memoization(ISCA 2014,TBDR 的 tile 尺寸与几何列表构建)— https://people.ac.upc.edu/jarnau/isca14-arnau.pdf
  9. Arm,Rendering Structures: Analyzing modern rendering on mobile(SIGGRAPH 2018,移动与中端桌面的差距量级)— https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/5127.siggraph_2D00_2018_2D00_mmg_2D00_3_2D00_rendering_2D00_hanskristian.pdf
  10. Impeller 渲染引擎的分块与重绘策略(tile 约 256×256)— https://differ.blog/p/advanced-performance-optimization-with-the-impeller-rendering-engine-d3b2c5c
  11. Arm,Mali GPU 最佳实践(开发者文档入口)— https://developer.arm.com/documentation/101897/latest/
  12. Android,游戏开发性能与热管理专题(ADPF 与游戏模式)— https://developer.android.com/games/optimize


图片版权

外部实拍素材全部来自 Wikimedia Commons,逐张登记如下(正文图注亦已标注作者与许可); 自绘示意图版权归本系列所有。

文件 作者 许可
src_analyzer_anritsu.jpg Dtwitkowski CC BY-SA 3.0
src_battery_gt5230.jpg Raimond Spekking CC BY-SA 4.0
src_battery_label.jpg Dmitry G CC BY-SA 3.0
src_battery_nexus.jpg MKFI Public domain
src_battery_nexus2.jpg MKFI Public domain
src_battery_swollen.jpg Stemoc CC0
src_board_back.jpg MarcoTangerino Public domain
src_board_front.jpg MarcoTangerino Public domain
src_board_lcd_lifted.jpg MarcoTangerino Public domain
src_board_lg.jpg Mbrickn CC BY 4.0
src_board_samsung.jpg Raimond Spekking CC BY-SA 4.0
src_camera_module.jpg Bautsch CC0
src_cell_pouch.jpg Shagett CC BY-SA 4.0
src_chip_qualcomm.jpg Mbrickn CC BY 4.0
src_cooling_plate.jpg Steve Jurvetson from Los Altos, USA CC BY 2.0
src_devboard_altera.jpg Thotypous (Paulo Matias) CC BY-SA 3.0
src_devboard_mojo.jpg SparkFun Electronics from Boulder, USA CC BY 2.0
src_die_broadwell.jpg cole8888 CC BY-SA 2.0
src_die_sn76489.png BirdbrainEngineer CC0
src_die_tms320.jpg Mister rf CC BY-SA 4.0
src_die_voodoo.jpg Fritzchens Fritz from Berlin CC0
src_disassembled.jpg Medvedev CC BY-SA 3.0
src_display_assembly.jpg Peddy https://www.ifixit.com/User/167584/Peddy CC BY-SA 3.0
src_dram_die_mmn.jpg Mister rf CC BY-SA 4.0
src_dram_samsung.jpg Raimond Spekking CC BY-SA 4.0
src_dram_tab2.jpg Raimond Spekking CC BY-SA 4.0
src_dreamcast_console.jpg Fritzchens Fritz CC0
src_fairphone_modules.jpg PKFP CC BY-SA 4.0
src_flir_phone.jpg Maurizio Pesce from Milan, Italia CC BY 2.0
src_godot_editor.png AfterCadaver CC BY-SA 4.0
src_gpu_datacolor.jpg Agnes Andersson CC BY 4.0
src_gpu_rtx2080.jpg Jacek Halicki CC BY-SA 4.0
src_heatsink.jpg Hans Haase CC BY-SA 4.0
src_hero_components.jpg DYVER CC BY-SA 4.0
src_mcu_die_micro.png Zom-B CC BY-SA 4.0
src_package_open.jpg (公有领域作品,见来源页) Public domain
ext_pipeline.png Original: Martin Wantke Vector: AntiCompositeNumber CC0
ext_pipeline_async.png Mewtow CC0
ext_pipeline_sync.png Mewtow CC0
src_pmic_ic.jpg Raimond Spekking CC BY-SA 4.0
src_power_analyzer.jpg Tiia Monto CC BY-SA 3.0
src_power_analyzer2.jpg dfrolov CC BY-SA 4.0
src_powervr2_die.jpg Fritzchens Fritz CC0
src_powervr3_die.jpg Fritzchens Fritz CC0
src_rf_shield.jpg Raimond Spekking CC BY-SA 4.0
src_scope_gwinstek.jpg BekundaOff CC BY 4.0
src_sip_package.jpg Mister rf CC BY-SA 4.0
src_switch_inside.png PantheraLeo1359531 CC BY 4.0
src_switch_ram.png PantheraLeo1359531 CC BY 4.0
src_thermal_phone.png Srnec media CC BY-SA 4.0
src_wlcsp.jpg Phiarc CC BY-SA 4.0
src_xoom_lpddr2.jpg Raimond Spekking CC BY-SA 4.0

相关链接 - 上一篇:(本系列首篇) - 下一篇(预告):【移动端图形与功耗】(二) 分块渲染:binning、片上内存与它的代价

With Best Wishes.