J:DownloadGDC2017GDC-FrameGraph.pptx
FrameGraph-Extensible_Rendering_Architecture_in_Frostbite.mp4
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165514283-195124921.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165518949-23834348.png)
- 改进引擎的扩展性
- 简化一步计算
- ESRAM
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165526284-2045471755.png)
- DICE次时代引擎
- EA引擎
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165541854-441505176.png)
- 游戏列表
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165600500-547932138.png)
- 07年引擎的渲染系统
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165607620-493674039.png)
- 对比17年的
- 除了绿色部分,整体架构貌似差不多
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165614690-2052780324.png)
- 简版的渲染系统
- 前向、后向
- 渲染上下文(RC),
- WR:
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165620695-755915434.png)
- 详细解释一下WR
- 代码驱动?
- 负责分配渲染资源(RT,Buffers)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165628122-1837557985.png)
- 战地四 用到渲染特性
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165636135-1624192059.png)
- WR的挑战:
- 资源管理
- 各自手工管理ESRAM
- 每个Team有各自的实现方式
- 和渲染系统高耦合
- 可扩展性差
- 代码量:4k行上涨到15K行
- 单个函数超过2k行
- 维护代码合并、集成代码代价很大
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165643051-492342161.png)
- 模块化的WR实现目标:
- 改进可扩展性
- 低耦合、组件式代码模块
- 自动化资源管理
- 可视化、可调试
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165648845-1006049962.png)
- 新架构中,添加了FrameGraph和Transient Resouces
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165654816-1957629655.png)
- 现在解释FG
- FG主要解决的问题
- 能构建整个帧的图节点
- 简化资源管理
- 简化渲染管线的配置
- 简化异步计算和资源隔离
- 能DIY
- 可视化和Debug
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165700914-899052149.png)
- 举一个FG的例子
- 橙色节点是渲染操作节点,蓝色节点是资源节点
- 能看到整个渲染管线流程
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165707062-1348332160.png)
- 战地4中的一个FrameGraph
- 上百个Pass和Resouce节点
- 超级大的Graph
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165713581-166224566.png)
- 演示内存分布
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165719289-1511907501.png)
- 脱离Immediate mode (底层模式)
- 渲染的代码抽取到passes
- 多阶段 retained mode (高端模式)
- Setup
- Compile
- Execute
- 这样做就是要统一模式,固定?
- 代码驱动架构?
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165724988-458148338.png)
- 详细及时FG的每个阶段
- 解释Setup阶段
- 定义了RenderPass和ComputePass
- 定义了资源的输入输出
- 代码流程类似于ImmediateMode
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165731105-2059603963.png)
- 在RenderPass中需要控制所有可用资源
- 可读
- 可写
- 可创建
- 其他永久性的资源用Import形式到FrameGraph
- Historybuffer
- BackBuffer
- 等
- 全局buffer?
- 固定
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165736853-1151488085.png)
- 举例说明一个Resource例子
- 创建一个renderTarget
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165742403-1769217803.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165747751-732730724.png)
- Setup的一个例子
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165753802-209035693.png)
- 高级操作
- 延迟创建资源
- 继承资源参数
- 移动子资源?
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165800228-1140826679.png)
- 延迟渲染模块到反射模块
- 解释MoveSubresource
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165806816-241345961.png)
- 编译阶段:
- 去除没有引用到的资源
- 分配实在的GPU资源
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165814285-1522944685.png)
- 禁用掉Lighting过程
- 插入DebugView
- 再将结果Move到FinalTarget上
- 这就是截断的例子
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165820870-1050895140.png)
- 执行阶段:
- 执行回调
- ImmediateMode
- 调用渲染API
- 设置state、resource、Shader
- Draw、Dispatch
- 在这个阶段获取GPU的实际使用资源(GPU层)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165826896-1618835411.png)
- 异步计算:
- 自动继承过来
- 手动控制的问题
- 内存增长
- 滥用影响性能
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165832702-82952476.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165838372-1237879699.png)
- 主线程到异步线程过程
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165843912-985748074.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165849336-1017176829.png)
- 采用C++类形式改造的问题:
- 破坏代码流程
- 需要大量引用?
- 导出现有代码到C++类太费力
- 考虑使用 C++Lambdas (C++14)
- 保存原有代码流程
- 在原有基础上最小的改动
- 在原有代码上包裹一层Lambda
- 添加一个ResourceUsage定义
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165855886-797128206.png)
- 一个例子
- &和= 重载?
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165902901-668801841.png)
- 渲染模块(每种Feature?)
- 渲染模块有两种类型
- 独立无状态函数?
- 输入输出是FG的Resource
- 可以嵌套Pass
- 这个是最常用的类型
- 常驻类型
- 常驻资源相关(LUTs History buffers)
- WR仍然属于高层级的渲染
- 不会去分配GPU资源
- 仅仅是控制各个渲染模块的开关
- 更加易于扩展
- 代码量从15K行减到5K行
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165909995-535999418.png)
- modules之间的通信
- 通过blackboard(黑板)通信
- component的hash表
- 举例说明
- BlurModule和TonemapModule通信
- blackboard.get<BlurPyramidData>
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165917011-1926858118.png)
- 临时资源管理
- FG中的关键组件?
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165923276-2059281786.png)
- 【临时资源系统底层】
- 不同平台下的不同处理
- XB1
- DX12 PS4
- DX11
- Texture的内存池
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165929272-1360000140.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165934997-1443668857.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165940380-1748192448.png)
- PS4上面的Texture的例子
- 在不同时期分配不同地址
- DX12上,分不同Heap
- XB1上,LightBuffer被分开了,
- 因为随申请随用?
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165946212-690221875.png)
- 【关于内存对齐的一些建议】
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165952887-479232677.png)
- 优先考虑DiscardResource而不是Clear
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303165959968-1673791500.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170008371-1456762151.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170016573-1841199063.png)
- 对齐隔离带
- CS Compute share
- PS Pixel Share
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170021397-1498101252.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170023431-1570902720.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170025788-416406618.png)
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170027789-24142643.png)
- 以战地4为例
- 147M为没有对齐的内存
- 不同平台的数据
- DX12 80M
- PS4 77M
- XB1 76M
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170030357-1931098738.png)
- 【总结】
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170033624-749794277.png)
- 【将来的工作】
![](https://images2018.cnblogs.com/blog/442386/201803/442386-20180303170035914-1110623726.png)
他的Blog