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

笔记

IMR过程

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

TBDR过程

宏观上两个阶段

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

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

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

两个Defer

第一个Defer

Binning
确定哪些块元渲染哪些图元
【技美百人计划】图形 3.7 移动端TB(D)R架构基础_第3张图片
■ 第二幅图里的红色三角形,只用一个块元就能渲染,所以它只会被分配到一个块元中
■ 第四幅图里的棕色三角形,需要多个块元才能渲染,所以它需要分配到9个块元中一起渲染

第二个Defer

  1. Qualcomm Adreno
    ○ 采用外置模块LRZ。
    ○ 在正常渲染管线之前,先多执行一次vs生成低精度depth texture,来提前剔除不可见的三角形(实现细节未公开)
    ○ 说人话,就是用硬件实现occlusion culling(遮挡剔除),功能类似软光栅中的遮挡剔除
    理解:将一种粗劣的early-z方法,提前到顶点阶段
  2. Mail的FPK
    ○采用Forward Pixel Kill技术
    ○ 位于管线的位置:发生在Early-z之后
    ○ 数据模型:先进先出的队列
    ○ 简单概括一下:
    ■ 队列中有4个Quad(可以理解为2×2像素的平面),每个Quad有屏幕上位置的数据和Z数据
    ■ Z越大代表离摄像机越远
    ■ 根据屏幕上相同位置(pos)的不同z,对不透明的像素进行替换(有近的就不渲染远的),这个过程叫作killed
    【技美百人计划】图形 3.7 移动端TB(D)R架构基础_第4张图片
  3. PowerVR的HSR(Hidden Surface Removal):给像素分图元
    硬件层实现 零overdraw 的优化:
    1.当一个像素通过了EarlyZ准备执行PS进行绘制前,先不画,只记录标记这个像素归哪个图元来画
    2.等到这个Tile上所有的图元都处理完了,最后再真正的开始绘制每个图元中被标记上能绘制的像素点。
    这样每个像素上实际只执行了最后通过EarlyZ的那个PS,而且由于TBR的机制,Tile块中所有图元的相关信息都在片上,可以极小代价去获得。

TBR 和 IMR 对比

【技美百人计划】图形 3.7 移动端TB(D)R架构基础_第5张图片
图(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架构基础_第6张图片【技美百人计划】图形 3.7 移动端TB(D)R架构基础_第7张图片
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内置)遮挡剔除

作业

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

TODO

为何powerVR上,alphablend比alphatest还省

参考资料

● [GPU性能指标 ]
https://www.gpuinsight.com/gpu_performance/
● [三星的GPU-FrameBuff指导]
https://developer.samsung.com/galaxy-gamedev/resources/articles/gpu-framebuffer.html
● [英伟达的TBR教学文章]
https://www.techpowerup.com/231129/on-nvidias-tile-based-rendering
● [ARM的TBR教学文章]
https://developer.arm.com/solutions/graphics-and-gaming/developer-guides/learn-the-basics/tile-based-rendering/single-page
● [苹果OpenGL程序开发指南]
https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Performance/Performance.html
● [OpenGL Insights]
https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf
● [知乎文章:Tile-based 和 Full-screen 方式的 Rasterization 相比有什么优劣]
https://www.zhihu.com/question/49141824
● [移动设备GPU架构知识汇总]
https://zhuanlan.zhihu.com/p/112120206
● [再议移动平台的AlphaTest效率问题]
https://zhuanlan.zhihu.com/p/33127345
● [移动平台GPU硬件学习与理解]
https://zhuanlan.zhihu.com/p/347001411
● [PowerVR开发者指南]
http://cdn.imgtec.com/sdk-documentation/Introduction_to_PowerVR_for_Developers.pdf
● [Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校]
https://www.cnblogs.com/gameknife/p/3515714.html
● [TBDR的HSR流程细节和使用AlphaBlend的效率提升程度]
https://www.zhihu.com/question/49141824
● [当我们谈优化时,我们谈些什么]
https://zhuanlan.zhihu.com/p/68158277
https://edu.uwa4d.com/course-intro/1/179
● [Alpha Test的双pass 优化思路]
https://zhuanlan.zhihu.com/p/58017068
● [个人收藏]
https://github.com/killop/anything_about_game#gpu-architecture
● [Adreno Hardware Tutorial 3: Tile Based Rendering]
https://www.youtube.com/watch?v=SeySx0TkluE&pbjreload=101
● [Mali GPU的独有特性]
https://www.cnblogs.com/hamwj1991/p/12404551.html
● [Mali-T880]
http://grmanet.sogang.ac.kr/ihm/cs170/20/HC27.25.531-Mali-T880-Bratt-ARM-2015_08_23.pdf
● [熊大的优化建议]
http://www.xionggf.com/post/unity3d/shader/u3d_shader_optimization/
● [GPU画像素的顺序是什么]
https://zhuanlan.zhihu.com/p/22232448
● [Tile-based Rasterization in Nvidia GPUs with David Kanter of Real World Tech]
https://www.youtube.com/watch?v=Nc6R1hwXhL8&t=973s&pbjreload=101

你可能感兴趣的:(【技美百人计划】图形,unity3d)