【省流总结】手机GPU和PC显卡有何不同?小芯片为何能玩大型游戏
摩尔线程、象帝先、芯动科技:是的孩子们,这个我们很熟悉
这里就解释了摩尔线程为何用IMG的POWERVR上PC端根本就不好使的原因了
github.com/Swung0x48/TriangleBin
超分其实也是很重要的一个迭代,不过即使是GCN的显卡也能享受到优化
不过从本期来看确实也证明了IMG POWERVR的移动端GPU和桌面端GPU的设计思路的区别以及生态的分裂,拿着移动端GPU架构并不能直接改出能用的桌面CPU
所以还是扣1复活S3扣2复活3DFX扣3复活SIS吧,至于指望IMG或者图芯之类的还是拉倒吧
可能已经习惯了在你的手机上玩游戏
这个手机这么一个小身板
那也是理所当然的 是吧
手机刚刚引入大型游戏的时候
比如当年的《无尽之剑》问世的时候
很多玩家看到那个画面
就我作为一个多年的PC玩家
就凭手机里这么一颗小芯片
它是怎么跑动那些大型游戏的呢?
为了让你在掌心上也能体验到游戏的乐趣
那他们到底做了些什么呢?
从设计思路上有什么根本性的不同呢?
今天我们就来好好跟大家聊一聊这里边的故事
根本上都来自一个在移动端发扬光大的渲染技术
之前我们在视频里已经简单聊过TBR
就是提前把要渲染的整张画面分成很多很多片
移动端为什么要这样渲染呢?
我们首先就得提到一个在手机GPU领域
玩机玩得久的同学一定听说过PowerVR这个名字
它是曾经的行业巨头 Imagination公司
PowerVR最早做的是游戏厅的街机GPU
在那个显卡行业勃勃生机万物竞发的年代
PowerVR之所以能混得风生水起
他们在GPU行业里有着一个独到的技术创新
核心就是我们上面提到的TBR
我们先来看看NVIDIA和ATI这些传统GPU
用的是“直接渲染”的管线
它具体是怎么工作的呢?
首先 游戏运行的第一步
CPU会告诉显卡需要绘制什么东西
比如你要绘制一个立方体
这些指令通过图形接口和显卡驱动来传递
它里面会包含物体的三维坐标
顶点连接关系等等重要信息
这些数据会被存在显存里面
会把物体的三维坐标“翻译”成屏幕上的二维投影
相当于从某个角度去看一个三维模型
然后把它拍成一张平面的图片
GPU需要把它切割成无数个小格子
这个切割过程叫做“光栅化”
GPU还要决定每个像素的具体颜色
像素着色器会根据物体的材质啊
纹理贴图以及光照效果
计算出每个像素该显示的颜色
所有像素的颜色都确定好后
这些数据会被写入帧缓冲区
然后就能展示出一帧完整的游戏画面了
就是GPU和显存之间的数据交换非常频繁
尤其是在后半段像素着色的时候
有大量数据需要在显存和GPU间来回传递
这就带来了两个大麻烦
一是显存带宽不够用了
二是显存功耗会非常高
它的显存给得够大够宽
包括街机 游戏机 移动设备
还有各种各样对成本敏感
对空间和散热敏感的产品来说
就很难喂饱吞吐量巨大的 GPU
PowerVR多年来就是在耕耘街机游戏机这些市场
人家的GPU最擅长的就是花小钱、出小力、办大事
率先引入了一种全新的渲染技术
但是你不直接一笔画完整个画布
而是把它切分成很多小块
整个场景的数据都要一次性送往显存
屏幕被切割成了很多小“块”
你可以把这些Tiles想象成一个个小“存储箱”
每个箱子里都存放着和这个区域相关的几何信息
然后为了避免浪费资源
TBR管线里也会用到另外一些技术
来先计算物体之间的遮挡关系
判断哪些部分在视野中是不可见的
就没必要去计算了 对吧
TBR会在每个Tile内部进行光栅化和着色
在现代GPU引入缓存机制之后
所以Tile上着色完的像素信息
是用不着立即传输到显存的
而是可以保存在GPU内部的缓存中
在需要的时候就能低延迟地调用
执行完透明度测试和后期深度测试后
GPU才把这个 Tile 渲出的一小块画面
送进显存的帧缓冲队列里面
TBR就可以节省海量的传输消耗
虽然切割Tile这件事情本身
也要消耗一些额外的资源
但和节省下来的性能功耗比起来
另外 TBR还有一个特别的优点
就是它对诸如MSAA这样的抗锯齿技术非常友好
开启抗锯齿会增加显存占用的
对需要做抗锯齿的物体的边缘读写4倍的framebuffer
但用上TBR之后就不需要直接在显存上读写了
就可以用更低的规格 少得多的内存带宽
实现不逊于竞争对手中档GPU的性能
他们当时推出的KYRO架构的显卡
确实都是瞄着性价比去的
我们之前就做视频聊过
英伟达在1999年的GeForce 256上实现了硬件T&L
直接在性能层面降维打击所有对手
甚至连3dfx这种巨头都败下阵来
最终PC显卡行业只留下了NV和ATi两根独苗
PowerVR也是在这个过程中被淘汰了
和最新的DX8接口的支持上慢了NV一拍之外
当时的开发者也普遍不太喜欢他们的TBR管线
可能由于驱动写得比较烂的关系
很多时候需要做额外的适配工作
然后他们显然也做不到跟NV正面硬刚性能
用在成熟的桌面显卡市场大家不愿意去配合
那如果用在一个不成熟的新市场
是不是一开始就能被大家接受呢?
PowerVR就瞄准了一个从来没人挖掘过的新方向
彼时的手机还刚从大哥大演进为彩屏呢
毕竟以当时人们的认知
他们做移动GPU一方面是看好便携式游戏设备
他们觉得未来手机会有越来越复杂的图形界面
手机这样重交互的设备
厂商一定会做出各种2D 3D的系统动画效果
这些交互动画会需要很多图形算力
仅仅凭借当时ARM9处理器那点CPU性能恐怕没法满足
给手机配备专用GPU绝对是有意义的
又特别适合用在手机上
因为手机恰恰就是缺内存带宽
实现手机上可用的图形效果了
世界上第一款手机专用GPU诞生了
这家伙后来被搭载在了很多的设备上
当时手机处理器的业界标杆
那使用这款芯片的最最经典的机型
N95在当年是真正的旗舰机皇
我上学那会同学里有富哥买了N95的
指望人家开恩借来玩一玩
用于支持iPhoneOS的界面动画和游戏娱乐
诺基亚的塞班旗舰和苹果的全触屏新机
这两个业界标杆都先用上了GPU
PowerVR算是借着智能机的东风
让GPU从CPU手里接管了顶点处理和光照计算
手机上也第一次拥有了可编程渲染管线
TBR的渲染流程也受益于此
可以更早地开始遮挡剔除的判断工作
SGX5这代GPU甚至可以说是现代移动GPU的开端
它也被用在了更多的设备里
摩托罗拉里程碑等一众
采用三星和德仪处理器的安卓机
甚至英特尔的Atom处理器里
应该有不少同学以前玩机的时候也接触过
这段时间也是Imagination混得最好的一段时间
手机图形标准也在慢慢完善
OpenGL专门为移动端做了ES标准
去适应低功耗低带宽的设备
所以其中很多优化就和TBR的特性契合上了
而其它厂商看到TBR技术很管用
从一开始就使用了TBR管线
而高通的Adreno就有点特殊了
他们最早是从ATi手里买来的IMR的GPU
正是 PowerVR 和他们发展的 TBR 技术
塑造了今天手机端的游戏渲染管线
既然TBR技术看起来如此多快好省
为什么当时的NV和ATI不去用它呢?
桌面端的独显不也可以受益吗?
哎 这个事情还是有点复杂的
除了我们前面讲到的PC开发者先入为主之外
TBR其实也有一些实打实的缺点的
TBR 这一套流程能够有效执行的前提
是前面切Tiles切片来处理顶点的代价
要小于后续处理整张图片的代价
切片行为本身不能消耗太多性能
很多时候游戏的模型做得太复杂
那么TBR的优势就会被削弱
并不会有意识地去考虑这件事
比如可能会给模型减面
尽可能让TBR发挥出更高的效率
TBR在特性上是比较依赖GPU自带的缓存的
但是像PC游戏上的环境光遮蔽啊
全局光照甚至光追这些进阶技术
往往都要借助其他数据
来协助计算现有Tile上的结果
这种时候本地缓存就没用了
因为还是要写回显存再读取出来
来给大家玩一个有意思的互动的小东西吧
这次我们也写了一个小软件来检测渲染顺序
在像素着色器的每次调用里
然后超过固定的数量就停止渲染
我们就可以知道你的GPU是按照什么顺序
给画面上的像素着色的了
这个小程序我们也作为一个课堂教具
大家可以自己下载下来玩玩看啊
来 你看 我们现在用的是一个桌面GPU
也不是像前面讲的那种严格的
严格地从上往下 从右往左去着色
也有一些分块的现象出现
GPU 还是按照一个个图元的顺序来处理
所以这个肯定不属于 TBR 的范畴
高通的 Adreno 就有点不一样了
它似乎在这种帧缓冲比较小
条件比较简单的情况下
转而去使用它 GPU 自带的大缓存
来直接执行类似 IMR 的步骤
而即使在几何比较复杂的时候
它在 Tiles 里也是先执行了类似于 IMR 的操作
先算好每个图元的可见性
再去给每个像素着色的
但是各家的方案还真是有点不一样的
OK 相信你看到这里也大概清楚了
TBR 是在移动端 SoC 硬件能力受限的背景下
诞生的一种丢芝麻捡西瓜的渲染策略
还是让用户能在手机上顺利地玩游戏
也并不只是出现在手机上
这几年来 我们熟悉的桌面端显卡
从英伟达的Maxwell也就是9系卡开始
就是把更多数据交换留在L2缓存上
来减少显存带宽的压力
如果硬件资源并不匮乏的情况下
像高通 Adreno GPU 在我们的测试里就是能伸能屈
当然前提也是它有尖端制程的大容量缓存加持
逐渐阔绰的移动端并没有忘记 IMR 的绝对性能
而多年来大手大脚惯了的桌面端
其实背地里也已经开始勤俭持家了
我觉得它们在技术上的更迭
其实都是为了更好地发挥硬件性能
我们关于手机GPU渲染管线的科普就告一段落了
但是希望大家看完能有所收获
不知道大家等会儿玩游戏的时候
会不会突然开始在意起这个画面
到底是怎么渲染出来的呢?
如果你觉得这期视频有干货的话呢
也别忘了关注我们频道 极客湾
那我们就下次再见了 拜拜
分享 举报文章很值,打赏犒劳作者一下
打赏 “首席”打赏官正虚席以待! 关注