type
Post
status
Published
date
Mar 15, 2023
slug
rendertexture-resolve
summary
移动端Buffer的数据传递方式
tags
category
技术分享
icon
password
什么是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的时候执行了三步操作:
- 将当前cache内信息写入当前FrameBuffer
- 切换FrameBuffer指针
- 从新的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的内容在进入后处理前就丢弃
- 作者:Reguluz
- 链接:https://reguluz.site/article/rendertexture-resolve
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。