zoukankan      html  css  js  c++  java
  • GDC2017:Framegraph-extensible-rendering-architecture-in-frostbite

    https://www.slideshare.net/DICEStudio/framegraph-extensible-rendering-architecture-in-frostbite

    J:DownloadGDC2017GDC-FrameGraph.pptx

    FrameGraph-Extensible_Rendering_Architecture_in_Frostbite.mp4

    • 改进引擎的扩展性
    • 简化一步计算
    • ESRAM


    • DICE次时代引擎
    • EA引擎


    • 游戏列表

    • 07年引擎的渲染系统

    • 对比17年的
    • 除了绿色部分,整体架构貌似差不多

    • 简版的渲染系统
    • 前向、后向
    • 渲染上下文(RC),
    • WR:

    • 详细解释一下WR
    • 代码驱动?
    • 负责分配渲染资源(RT,Buffers)

    • 战地四 用到渲染特性


    • WR的挑战:

    • 资源管理
      • 各自手工管理ESRAM
      • 每个Team有各自的实现方式

    • 和渲染系统高耦合
    • 可扩展性差
    • 代码量:4k行上涨到15K行
      • 单个函数超过2k行
      • 维护代码合并、集成代码代价很大

    • 模块化的WR实现目标:

      • 改进可扩展性
        • 低耦合、组件式代码模块
        • 自动化资源管理
      • 可视化、可调试

    • 新架构中,添加了FrameGraph和Transient Resouces


    • 现在解释FG
    • FG主要解决的问题
      • 能构建整个帧的图节点
        • 简化资源管理
        • 简化渲染管线的配置
        • 简化异步计算和资源隔离
      • 能DIY
      • 可视化和Debug

    • 举一个FG的例子
    • 橙色节点是渲染操作节点,蓝色节点是资源节点
    • 能看到整个渲染管线流程


    • 战地4中的一个FrameGraph
    • 上百个Pass和Resouce节点

    • 超级大的Graph


    • 演示内存分布

    • 脱离Immediate mode (底层模式)
    • 渲染的代码抽取到passes
    • 多阶段 retained mode (高端模式)
      • Setup
      • Compile
      • Execute
    • 这样做就是要统一模式,固定?
    • 代码驱动架构?

    • 详细及时FG的每个阶段
    • 解释Setup阶段
      • 定义了RenderPass和ComputePass
      • 定义了资源的输入输出
      • 代码流程类似于ImmediateMode


    •  在RenderPass中需要控制所有可用资源
      • 可读
      • 可写
      • 可创建
    • 其他永久性的资源用Import形式到FrameGraph
      • Historybuffer
      • BackBuffer
      • 全局buffer?
      • 固定

    • 举例说明一个Resource例子
    • 创建一个renderTarget




    • Setup的一个例子


    • 高级操作
      • 延迟创建资源
      • 继承资源参数
      • 移动子资源?

    • 延迟渲染模块到反射模块
    • 解释MoveSubresource


    • 编译阶段:
    • 去除没有引用到的资源
    • 分配实在的GPU资源


    • 禁用掉Lighting过程
    • 插入DebugView
    • 再将结果Move到FinalTarget上
    • 这就是截断的例子

    • 执行阶段:
      • 执行回调
      • ImmediateMode
        • 调用渲染API
        • 设置state、resource、Shader
        • Draw、Dispatch
      • 在这个阶段获取GPU的实际使用资源(GPU层)


    • 异步计算:
      • 自动继承过来
      • 手动控制的问题
        • 内存增长
        • 滥用影响性能



    • 主线程到异步线程过程



    • 采用C++类形式改造的问题:
      • 破坏代码流程
      • 需要大量引用?
      • 导出现有代码到C++类太费力
    • 考虑使用 C++Lambdas (C++14)
      • 保存原有代码流程
      • 在原有基础上最小的改动
        • 在原有代码上包裹一层Lambda
        • 添加一个ResourceUsage定义

    • 一个例子
    • &和= 重载?


    • 渲染模块(每种Feature?)
    • 渲染模块有两种类型
      • 独立无状态函数?
        • 输入输出是FG的Resource
        • 可以嵌套Pass
        • 这个是最常用的类型
      • 常驻类型
        • 常驻资源相关(LUTs History buffers)
    • WR仍然属于高层级的渲染
      • 不会去分配GPU资源
      • 仅仅是控制各个渲染模块的开关
      • 更加易于扩展
      • 代码量从15K行减到5K行

    • modules之间的通信
    • 通过blackboard(黑板)通信
      • component的hash表
    • 举例说明
      • BlurModule和TonemapModule通信
      • blackboard.get<BlurPyramidData>

    • 临时资源管理

    • FG中的关键组件?

    • 【临时资源系统底层】
    • 不同平台下的不同处理
      • XB1
      • DX12 PS4
      • DX11
    • Texture的内存池


    • PS4上面的Texture的例子
    • 在不同时期分配不同地址
    • DX12上,分不同Heap
    • XB1上,LightBuffer被分开了,
      • 因为随申请随用?

    • 【关于内存对齐的一些建议】


    • 优先考虑DiscardResource而不是Clear

    • 对齐隔离带
    • CS Compute share
    • PS Pixel Share

    • 以战地4为例
    • 147M为没有对齐的内存
    • 不同平台的数据
      • DX12 80M
      • PS4 77M
      • XB1 76M

    • 【总结】



    • 【将来的工作】


    他的Blog














  • 相关阅读:
    leetcode
    leetcode
    leetcode
    leetcode
    Postman
    Fiddler抓百度和bing搜索包
    Jmeter脚本录制
    Android Studio使用Maven国内镜像
    Open Live Writer
    PureXXX使用手记
  • 原文地址:https://www.cnblogs.com/username/p/8497150.html
Copyright © 2011-2022 走看看