带宽:GPU 的粮道在哪里堵住了(发烫优化系列 · 第 2 篇)

📅 发布时间:2026/9/4 18:12:31
带宽:GPU 的粮道在哪里堵住了(发烫优化系列 · 第 2 篇)
上一篇我们说过一个反直觉的结论手机发烫烧的不是算力而是搬运——Arm 官方给出的数字是DRAM 访问每 GB/s 要付 80–100mW 的电。 这一篇把这个结论的物理基础彻底讲透带宽到底是什么、为什么在手机上如此金贵、以及怎么用 5 分钟判断自己的游戏是不是带宽瓶颈。本文是《Unity 游戏为什么发烫》系列的第 2 篇。看懂这一篇后面讲 Overdraw、纹理压缩、后处理的所有优化手段你都会知道它们为什么有效。一、先分清三个天天被混淆的概念很多开发者聊优化时把这三个词混着用其实它们说的是三件完全不同的事概念说的是什么类比常见单位内存容量能存多少数据仓库面积GB带宽Bandwidth每秒能搬多少数据马路每小时能过多少车GB/s延迟Latency一次往返要多久单程耗时ns三个概念里容量是最好理解的带宽是最容易被忽视的。买手机看参数都是12GB 内存没人宣传带宽多少 GB/s——但对做游戏的人来说带宽才是决定帧率和发热的那条命脉。一个直观的数字对比手机主流的 LPDDR5 带宽大约在 25–60 GB/s 这个量级而 PC 独立显卡的 GDDR6 显存能到几百 GB/s。手机天生比 PC 窄一个数量级而你的游戏要跑的画面复杂度可没有低一个数量级。二、为什么搬运这么贵存储层级金字塔要理解带宽为什么贵得先看数据住在哪。现代芯片的存储是一个金字塔金字塔越往上越快越小越往下越大越慢。关键在于缓存SRAM和内存DRAM是两种完全不同的物理器件DRAMSRAM存一个 bit1 个电容 1 个晶体管6 个晶体管速度约 100ns几 ns快几十倍容量/成本便宜能做几十 GB贵只能做几 KB几十 MB用途内存手机 LPDDRCPU/GPU 的缓存注意 DRAM 的第一个特点它靠电容存电荷记 bit电容会漏电所以每隔几十毫秒必须把所有数据读一遍再写回去——这就是Dynamic动态的含义。也就是说DRAM 即使没人访问它光维持数据就在耗电。所以 GPU 干活的真实流程是先问缓存要数据缓存里有命中就便宜快速缓存里没有未命中就得去 DRAM 搬——跨芯片跑一个来回延迟上百倍功耗几十倍。这就是那句一次内存访问的耗电够 ALU 算几十次的来历。推论优化带宽有两个方向——要么少搬减少总量要么搬得巧让数据在缓存里挨得近、命中率高。后面你会看到纹理压缩走的是第一条路Mipmap 走的是第二条路。三、手机的先天劣势一条马路两家合租PC 的架构是各住各家CPU 用内存条GPU 用独立显存各有各的带宽通道。手机是 SoCSystem on ChipCPU、GPU、ISP 等模块挤在一块芯片里共用同一块 LPDDR走同一条总线——一家马路两家合租还要跟 ISP拍照时、基带抢路。这带来两个直接后果带宽天生就窄前文说的数量级差距搬运的每一字节都直接计费——Arm 的 80–100mW/GB/s 就是在这条共享总线上量出来的。四、移动 GPU 的自救TBDR 架构正因带宽金贵移动端 GPUMali、Adreno在设计上和 PC GPU 走了完全不同的路线——TBDRTile-Based Deferred Rendering基于分块的渲染把画面切成一块块小 tile比如 32×32 像素先对整帧做几何处理算出每个 tile 里有哪些图元对每个 tile在芯片内部一块很小的 SRAMtile memory里完成所有着色和混合算完才把最终结果写回 DRAM。对比一下 PC 的立即模式渲染——画什么写什么帧缓冲读写全走显存。TBDR 相当于攒一批货用小推车在车间里倒腾完最后只跑一趟大仓库。Arm 官方文档明确说明这种架构比传统渲染需要的带宽更少、功耗更低——它是被手机带宽窄、搬运贵逼出来的设计。理解 TBDR 还有个实用副产品你会明白为什么某些在 PC 上无害的写法在手机上格外致命——比如频繁切换渲染目标、大量乱序小绘制都会破坏 tile 的批处理让本该一趟的搬运变成多趟。五、你的带宽被谁吃掉了搬进 DRAM 又搬出来的数据主要就三个流向1. 纹理采样最大头——片元着色器每输出一个像素基本都要读纹理。纹理越大、每像素采样次数越多多重采样、法线贴图、光照贴图……搬运越猛。2. 帧缓冲读写——每个透明像素 读旧色 混合 写新色。Overdraw 叠 N 层这里就乘 N。这是上一篇搬运惯犯Overdraw 的账单明细。3. 全屏后处理——每个 pass 都把整屏像素读写一遍。Bloom 景深 Color Grading 挂三个整屏数据就多跑六个来回读写各算一次。对着 Arm 的账本算一笔假设 1080p、RGBA32 帧缓冲、平均 Overdraw 3 倍、再加 2 个全屏后处理 pass每秒 60 帧——纹理加帧缓冲的搬运量很容易冲到几个 GB/s 的量级。对照 650mW 的 DRAM 功耗预算你就知道自己为什么烫了。六、5 分钟判断你是不是带宽瓶颈原理讲完了给一个立刻能用的土办法——降分辨率测试把 URP 的Render Scale 降到 0.5跑一遍就是改一个参数的事观察 GPU 帧时间GPU 帧时间大幅下降比如 12ms 掉到 5ms→ 基本是带宽瓶颈。因为像素数是平方关系分辨率减半像素量降到 1/4带宽需求随之大降GPU 帧时间几乎不变→ 瓶颈在别处。去查 Draw CallCPU 提交成本或顶点量。为什么这招好用因为它只精准打击随像素数线性增长的搬运其他瓶颈不随分辨率变化——这是一个天然的隔离实验。顺带一提它反过来也告诉你一件事如果你是带宽瓶颈那降 Render Scale 到 0.75本身就是最便宜的救命药像素量降 44%比改任何代码都快。再补一个进阶的真想看精确数字Mali 机器用Arm Streamline、高通机器用Snapdragon Profiler都有现成的带宽计数器bytes/sec——优化前后带宽降了多少一目了然。带宽降了 40%功耗基本同比例下降不用拆机测电流。七、省带宽的四大方向后续各篇展开方向手段原理详见少搬纹理压缩ASTC每像素字节数降到 1/9第 4 篇搬得巧Mipmap数据在缓存里挨得近、命中率高第 4 篇别重复搬减 Overdraw帧缓冲读写 ×N → ×1第 3 篇少生成像素降 Render Scale像素数平方级下降第 8 篇八、总结把这一篇压缩成三句话带宽是马路的通行能力不是仓库大小——手机这条路天生比 PC 窄一个数量级而且每 GB/s 要付 80–100mW 的过路费搬运贵是因为数据住在金字塔底层——一次 DRAM 访问的耗电和延迟够缓存访问几十次、够 ALU 算几十次移动 GPU 的 TBDR 架构就是被这条路逼出来的判断只需 5 分钟——Render Scale 降到 0.5 跑一遍GPU 帧时间大幅下降就是带宽瓶颈。下一篇我们收拾名单上的第一个惯犯Overdraw。我会展示两幅肉眼完全一样的画面帧率却差一倍——视觉相同、成本不同这是全系列最眼见为实的一篇。系列目录关注我 持续更新为什么你开发的 Unity 游戏越玩越烫—— 热节流恶性循环与搬运≈功耗的总纲 ✅带宽GPU 的粮道在哪里堵住了本篇—— DRAM/带宽/延迟以及 5 分钟定位带宽瓶颈的土办法Overdraw同一面墙刷了 N 遍漆 —— Overdraw优化纹理与后处理搬运量最大的两个惯犯 —— ASTC 压缩、Mipmap 与缓存命中CPU 不是无辜的GC、Draw Call 与 Canvas 重建 —— 另一半功耗的账光照烘焙降温性价比之王 —— 一招常砍半 GPU 功耗锁帧的智慧拿帧率换发热余量 —— 为什么锁帧不是偷懒而是策略收官七大热源排查清单 功耗测量实战 —— 带走的 Checklist