PC硬件架构
CPU Cache
L1为CPU的一级缓存、L2为二级缓存,L1离CPU更近,访问速度高于L2,但容量比L2小
内存类型
VM (Video Memory,Video DRAM )
居于显卡上的显存, GPU直接访问,CPU无法访问
SM (SYSTEM MEMORY,System DRAM )
居于系统内存中,CPU能访问, GPU无法访问
AM (AGP momery Accelerated Graphic Ports,AGP DRAM)
为了使系统和图形加速卡之间的数据传输获得比PCI总线更高的带宽,从SM上分配出来。
GPU能访问,CPU能访问。CPU读取AGP内存速度很慢,写的速度比读取稍微快,GPU读和写的速度比VM慢一些
资源类型
程序员在用DX创建不同类型的资源时,要根据资源的特点,来决定是放在VM、SM还是AM上
D3DPOOL_MANAGED (dx11对应D3D11_USAGE_DYNAMIC)
① 该类型的资源创建在SM上,在需要渲染时,pci到VM上,存在两份
DX会使用最近最少使用算法(LRU)来对VM进行释放,如果再次请求会在SM->(pci)->VM
② 设备失效后,VM那份丢失,将会自动从SM->(pci)->VM
③ 适用于静态物件(所有静态物件的veterx、index、GPU Skin等,凡是一次创建,终身使用,中途不再更改的)
D3DPOOL_DEFAULT (dx11对应D3D11_USAGE_DEFAULT)
① 有专属的分配优先级,分配原则:优先VM,次之AM,最后SM,等同于告诉DX抽象层:我要放在你认为最快访问的地方
② DX抽象层不负责该类型资源释放,用户自己进行release管理
③ 设备失效时,需要手动恢复
④ 适用于render targets、depth/stencil buffers等,gpu能快速访问
D3DPOOL_SYSTEMMEM (dx11对应D3D11_USAGE_STAGING)
① 放在SM中,不能用于图形管线,但格式仍然受到图形硬件、驱动限制(如:最大尺寸)。可通过pci随时对POOL_DEFAULT类型资源进行update
② 设备失效对该类型无影响
D3DPOOL_SCRATCH
① 放在SM中,不能用于图形管线,且不受图形硬件、驱动限制,资源之间可互相赋值。gpu无法访问
② 设备失效对该类型无影响
不同地组合情况见下图所示:
Mobile硬件架构
Mobile上使用统一的内存架构,CPU和GPU都通过总线来访问SM (SYSTEM MEMORY,System DRAM )
Geometry Data、Texture Data及Frame Buffer在SM中,GPU频繁地访问这些数据,会导致带宽消耗大,成为性能瓶颈
IMR(Immediate Mode Rendering)的管线
Mobile如果使用IMR(Immediate Mode Rendering)模式(直接在SM上读写Depth Buffer/Frame Buffer)的话
带宽消耗很大,另外与读写On-Chip Depth Buffer(SRAM) / On-Chip Color Buffer(SRAM)相比,耗电量很高(高出2个数量级)
Mobile设备通过DVFS(Dynamic Voltage and Frequency),动态控制手机功率,当耗电量大发热大时,就会引发降频,导致设备性能下降,游戏帧率低。
因此,Mobile上gpu的设计原则就是要尽量省电。
IMR模式流程图如下:
TBR(Tile-based rendering)的管线
基于上面原因,现代Mobile gpu都采用TBR(Tile-based rendering,基于图块的渲染)的管线
注:On-Chip Depth Buffer(SRAM) / On-Chip Color Buffer(SRAM)统称为Local Tile Memory
① 分块大小一般为16x16或32x32像素
② 在几何阶段之后,会执行分块(Tiling),然后将各个Tile逐个执行光栅化,并最后写入到Frame Buffer中
③ 按Tile为单位处理,会大大减少对Primitive List/Vertex Data、Texture Data和Frame Buffer的读写,从而大幅度减低对带宽的占用
④ 引入On-Chip Depth Buffer和On-Chip Colour Buffer等片上Cache,gpu读写这些Cache速度极快,且不怎么耗电
TBDR(Tile-based deferred rendering)的管线
第一部分处理所有vertex shader,输出结果到主内存
第二部分为HSR(Hidden Surface Removal),在tile上执行。会先处理所有三角形的可见性,保存在一个专用的buffer里面。
这个buffer里,会保存tile里每个像素位置目前可见的三角形,应该执行哪个shader等信息
第三部分真正开始执行fragment shader,在tile上执行。因为第二部分里有像素级别精度的可见性信息,所以这步只会计算实际可见的像素,不可见的像素不会浪费GPU计算力。
避免Overdraw时的无用计算
Mobile上消耗带宽的常见原因
① 切换rendertarget 如:后处理、渲染shadowmap
② 大量采样贴图 如:在ps里面采样大的物体(地形、天空、大的建筑)的贴图
③ 顶点、面数过多
参考
Understanding PowerVR Series5XT: PowerVR, TBDR and architecture efficiency
A look at the PowerVR graphics architecture: Tile-based rendering
A look at the PowerVR graphics architecture: Deferred rendering
How low can you go? Building low-power, low-bandwidth ARM Mali GPUs