什么是Resolve

转自KlayGE游戏引擎
  • Tiled Based在进行光栅化的时候不是直接对Frame Buffer进行操作。
  • 手机中,FrameBuffer的数据放在共用内存中被声明为显存的片段。
  • Tiled光栅化是逐tile进行,每个tile的数据和SoC中GPU部分的OnChip cache进行交互。单tile处理完后再从cache中存回FrameBuffer,因此不需要与FrameBuffer进行频繁的数据交换。
而上文中
  • 从cache存回FrameBuffer 的操作,被称为Resolve,Resolve的最小单位是一个Tile
  • 从FrameBuffer读到cache的操作,成为Restore
 
切换RenderTarget\BindFrameBuffer的时候执行了三步操作:
  1. 将当前cache内信息写入当前FrameBuffer
  1. 切换FrameBuffer指针
  1. 从新的FrameBuffer中载入新的cache
 
为了提高性能,对于不需要读取的数据需要即使设置Discard,来减少一次restore。上述步骤中如果新的FrameBuffer内的数据是旧的不需要渲染的,则在SetRenderTarget后设置不restore以减少一次带宽开销
 

移动端Resolve优化思考

  • 每当RenderTarget切换时(cmd.SetRenderTarget),会进行一次Resolve。打开Unity的Frame Debugger,每一项的detail界面顶部都会显示一个RenderTarget,当这个RenderTarget发生改变时,说明发生了一次TargetSwitch(也就是发生了一次Resolve和一次Restore)
  • 切换RenderTarget时,在移动端表现为需要将当前Cache内容强制Resolve回内存的FrameBuffer中,并将新的Buffer从内存中Restore到cache,这一步操作效率较低,因尽量避免。
  • 通常管线中,切换target有几个固定点
    • 各种效果Buffer在所有对象渲染前有自己的RT,切换到正常渲染的pass需要一次(从特定声明的相机转到场景相机)
    • 在渲染Transparent之前,copydepth pass固定需要切换一次target(从cameraOutput转为用于存储深度的RT)
    • 渲染Transparent后某些常用指定pass的效果(比如扭曲)需要切换两次target(从场景相机切换到特定相机做诸如俯视相机等的功能,再在后处理前切回来)
    • 多pass的后处理效果通常都需要SwitchTarget,尤其是做Pingpong的效果。如Bloom、DOF、GodRay、RadialBlur等
  • 可以减少的部分,如后处理阶段把不需要深度的pass放在靠后位置,在某个时间点后对depthbuffer的Load和Store模式都设置为dontcare。对于低端机后处理不再进行相关高品质效果的可以让DepthBuffer的内容在进入后处理前就丢弃
     
    颜色数据压缩的小技巧关于HDR数据的压缩(到RT)