【技美百人计划】图形 3.7 移动端TB(D)R架构基础

笔记

IMR过程

【技美百人计划】图形 3.7 移动端TB(D)R架构基础
直接和系统内存进行交互

TBDR过程

宏观上两个阶段

第一阶段:分图元
● 执行所有与几何相关的处理,并生成Primitive List(图元列表)
● 并且确定每个Tile(块)上有哪些Primitve(图元)
第二阶段:HSR
● 执行光栅化及后续处理
● 并在完成后,将FrameBuffe从Tile Buffe写会到System Memory中

【技美百人计划】图形 3.7 移动端TB(D)R架构基础
On-Chip Buffers : 片上内存
System Memort :系统内存

Tiling过程:将顶点处理形成的各种几何数据刷到系统内存
经过光栅化、像素shader和ROP,最终把结果刷到片上内存,最终片上内存再刷到系统内存

TBR 和 IMR 对比

【技美百人计划】图形 3.7 移动端TB(D)R架构基础
图(a)TBR架构
■ 几何处理数据形成了FrameData(放在System Memory上)
■ 这些Frame Data经过片段处理,结果放在了Tile Buffer上(片的内存上)
■ 最后的把结果刷到FrameBuffer中(System Memory上)
图(b)IMR架构
■ 对比TBR,少了两个环节:
● 几何处理数据直接到片段处理,没有中间数据(Frame Data)
● 直接刷到System Memory上了,没有经过片内存(On-Chip Memory)

执行顺序

【技美百人计划】图形 3.7 移动端TB(D)R架构基础
【技美百人计划】图形 3.7 移动端TB(D)R架构基础【技美百人计划】图形 3.7 移动端TB(D)R架构基础
IMR从左到右,再从右到左。过度位置,会有犬牙交错的表现。

两者过渡的地方,没有严格按照从左到右或右到左,还是存在一定的随机性/不确定性。

TBR总结

核心目的

为了降低带宽,减少功耗,但渲染帧率上并不比IMR快

优点

  1. 消除OverDraw提供了机会:
    ○ PowerVR有HSR技术,Mali有Forward Pixel Killing技术,都有为了最大限度减少被遮挡的pixel的texturing和shading
  2. 缓存友好(Cache friendly),在cache的读写速度要比全局内存中快得多(以降低帧率为代价,降低带宽、功耗)

缺点

  1. binning过程是在vertex阶段之后,将输出的数据写到系统内存(DDR)上,然后才能被fragment shader读取。这样一来几何数据过多的管线,容易在此处有性能瓶颈
  2. 如果某些三角形覆盖到多个tile(块)上,会被绘制数次。这样就意味着:总渲染时间多于IMR

优化

  1. 记得在不使用FrameBuffer的时候clear或discard
    ○ 这样做主要是为了清空积存在tile buffer上的中间数据(前边提到的Frame Data),
    ○ 所以对Unity里的rt(render texture)的使用也特别说明一下:
    ■ 当我们不再使用这个rt的时候,尽量调用一次Discard
    ○ 在OpenGl ES上,要善用glclear,glInvalidateFrameBuffer,避免不必要的Resolve(tile buff刷新到system memory)行为
  2. 不要在一帧里频繁的切换FrameBuffer的绑定
    ○ 本质:减少tile buffer和system memory之间的stall(同步)操作
  3. 对于移动平台,建议使用Alpha混合,而非Alpha测试。todo为什么!!!
    ○ 是一个经验性的结论
    ○ 在实际使用的过程中应该使用比较两者的表现
    ○ 通常情况下,移动端应该避免使用Alpha混合来实现透明,如果确实要用,尝试缩小混合区域的覆盖范围
  4. 手机上必须用Alpha Test时,先做一遍Depth Prepass(参考Alpha Test 的双pass优化思路)todo为什么!!!
  5. 图片尽量压缩
    ○ 例如ASTC 、ETC2
  6. 图片尽量走mipmap
  7. 尽量使用从vertex shader传来的Varying变量uv值采样贴图(连续的),不要在Fragment shader里动态计算贴图的uv值(非连续的),否则CacheMiss
  8. 在延迟渲染中,尽量利用Tile Buffer,(参考传统延迟渲染和TBDR)
  9. 如果在Unity中调整ProjectSetting—Quality—Rendering—Texture Quality的不同设置,或者不同分辨率下,帧率有很大的变化,大概率是带宽出问题了
  10. MASS在TBDR下反而是非常快速的
    ○ MSAA是硬件上的,发生在片上的
    ○ 相比FSAA,在手机上是非常快的
  11. 少在Fragment shader中使用discard函数,调用gl_FragDepth从而打断Early-DT的过程(hlsl中为Clip,glsl中为discard)todo为什么!!!
  12. 在shader使用浮点数精度值时,有目的的区分使用float,half
    ○ 优点
    ■ 带宽减少
    ■ GPU中用的周期数减少,因为着色器编译器可以优化你的代码来提高并行化程度
    ■ 要求的统一变量寄存器的数量减少,这样反而又降低了寄存器数量溢出风险。
    ■ 具体参考:熊大的优化建议、shader数学计算优化技巧
  13. 在移动端的TBDR架构中,顶点处理部分容易成为瓶颈
    ○ 避免使用曲面细分shader,置换贴图等副操作
    ○ 提倡使用模型LOD,(本质上减少Frame Data的压力)
    ○ Unity中尽早的在应用阶段做umbra(Unity内置)遮挡剔除

作业

打包到安卓平台,对比 优化点前后的性能变化
苹果用户难受。。。

上一篇:diff算法和渲染/更新流程


下一篇:Hadoop运行程序的时候在日志里发现的错误