笔记
IMR过程
直接和系统内存进行交互
TBDR过程
宏观上两个阶段
第一阶段:分图元
● 执行所有与几何相关的处理,并生成Primitive List(图元列表)
● 并且确定每个Tile(块)上有哪些Primitve(图元)
第二阶段:HSR
● 执行光栅化及后续处理
● 并在完成后,将FrameBuffe从Tile Buffe写会到System Memory中
On-Chip Buffers : 片上内存
System Memort :系统内存
Tiling过程:将顶点处理形成的各种几何数据刷到系统内存上
经过光栅化、像素shader和ROP,最终把结果刷到片上内存,最终片上内存再刷到系统内存
TBR 和 IMR 对比
图(a)TBR架构
■ 几何处理数据形成了FrameData(放在System Memory上)
■ 这些Frame Data经过片段处理,结果放在了Tile Buffer上(片的内存上)
■ 最后的把结果刷到FrameBuffer中(System Memory上)
图(b)IMR架构
■ 对比TBR,少了两个环节:
● 几何处理数据直接到片段处理,没有中间数据(Frame Data)
● 直接刷到System Memory上了,没有经过片内存(On-Chip Memory)
执行顺序
IMR从左到右,再从右到左。过度位置,会有犬牙交错的表现。
两者过渡的地方,没有严格按照从左到右或右到左,还是存在一定的随机性/不确定性。
TBR总结
核心目的
为了降低带宽,减少功耗,但渲染帧率上并不比IMR快
优点
- 给消除OverDraw提供了机会:
○ PowerVR有HSR技术,Mali有Forward Pixel Killing技术,都有为了最大限度减少被遮挡的pixel的texturing和shading - 缓存友好(Cache friendly),在cache的读写速度要比全局内存中快得多(以降低帧率为代价,降低带宽、功耗)
缺点
- binning过程是在vertex阶段之后,将输出的数据写到系统内存(DDR)上,然后才能被fragment shader读取。这样一来几何数据过多的管线,容易在此处有性能瓶颈
- 如果某些三角形覆盖到多个tile(块)上,会被绘制数次。这样就意味着:总渲染时间多于IMR
优化
- 记得在不使用FrameBuffer的时候clear或discard
○ 这样做主要是为了清空积存在tile buffer上的中间数据(前边提到的Frame Data),
○ 所以对Unity里的rt(render texture)的使用也特别说明一下:
■ 当我们不再使用这个rt的时候,尽量调用一次Discard
○ 在OpenGl ES上,要善用glclear,glInvalidateFrameBuffer,避免不必要的Resolve(tile buff刷新到system memory)行为 - 不要在一帧里频繁的切换FrameBuffer的绑定
○ 本质:减少tile buffer和system memory之间的stall(同步)操作 - 对于移动平台,建议使用Alpha混合,而非Alpha测试。todo为什么!!!
○ 是一个经验性的结论
○ 在实际使用的过程中应该使用比较两者的表现
○ 通常情况下,移动端应该避免使用Alpha混合来实现透明,如果确实要用,尝试缩小混合区域的覆盖范围 - 手机上必须用Alpha Test时,先做一遍Depth Prepass(参考Alpha Test 的双pass优化思路)todo为什么!!!
- 图片尽量压缩
○ 例如ASTC 、ETC2 - 图片尽量走mipmap
- 尽量使用从vertex shader传来的Varying变量uv值采样贴图(连续的),不要在Fragment shader里动态计算贴图的uv值(非连续的),否则CacheMiss
- 在延迟渲染中,尽量利用Tile Buffer,(参考传统延迟渲染和TBDR)
- 如果在Unity中调整ProjectSetting—Quality—Rendering—Texture Quality的不同设置,或者不同分辨率下,帧率有很大的变化,大概率是带宽出问题了
-
MASS在TBDR下反而是非常快速的
○ MSAA是硬件上的,发生在片上的
○ 相比FSAA,在手机上是非常快的 - 少在Fragment shader中使用discard函数,调用gl_FragDepth从而打断Early-DT的过程(hlsl中为Clip,glsl中为discard)todo为什么!!!
- 在shader使用浮点数精度值时,有目的的区分使用float,half
○ 优点
■ 带宽减少
■ GPU中用的周期数减少,因为着色器编译器可以优化你的代码来提高并行化程度
■ 要求的统一变量寄存器的数量减少,这样反而又降低了寄存器数量溢出风险。
■ 具体参考:熊大的优化建议、shader数学计算优化技巧 - 在移动端的TBDR架构中,顶点处理部分容易成为瓶颈
○ 避免使用曲面细分shader,置换贴图等副操作
○ 提倡使用模型LOD,(本质上减少Frame Data的压力)
○ Unity中尽早的在应用阶段做umbra(Unity内置)遮挡剔除
作业
打包到安卓平台,对比 优化点前后的性能变化
苹果用户难受。。。