37

Building Paragon in UE4

Embed Size (px)

Citation preview

Page 1: Building Paragon in UE4
Page 2: Building Paragon in UE4
Page 3: Building Paragon in UE4

• 目标平台:PS4• 60Hz• 1600x900 for 3D, 1080p for UI

• 目标平台:PC: Direct3D 11• 适配

• 固定的方向光, 总体场景mesh静态为主• 预烘培的GI(Lightmass)• 动态的Per object shadows

• 同屏: <=10 英雄, <=120 小兵• 对cpu,gpu,内存和网络的优化

Page 4: Building Paragon in UE4

Page 5: Building Paragon in UE4

• 预测位置,不用blend到idle• 位置预测• Distance Curve• Rotation Curve

• Speed Warping

Page 6: Building Paragon in UE4

• 预测位置,不用 到• :•

••

• 分层组织• 从上往下,从左往右• 层次:

• LOCOMOTION

• LAYERS

• POST-PROCESSING.• 通过特定的层从GAMEPLAY层控制技能效果

Page 7: Building Paragon in UE4
Page 8: Building Paragon in UE4
Page 9: Building Paragon in UE4

原始动画

缩放轴

缩放后的IK目标位置

结果位置

Page 10: Building Paragon in UE4

优化

• 动画的三大阶段:

• Tick (Game Thread)• 从bp的event graph改到了C++

• Update (计算权重)• 挪到了工作线程• 对于event中的变量,加了“Fast Path”

• Evaluate (解压和blend)• 挪到了工作线程,cook过程与计算一部分

增量数据, 快了近3倍

Page 11: Building Paragon in UE4

优化

• 去除大量内存申请,加了个stack allocator,快了约2倍

• 对不重要的mesh用了固定的bounds(小兵)

• 利用了已经存在的URO (Update Rate Optimizations)

• 根据距离或者Significance结果,降低meshes的update频率

• 对远处的mesh,跳过插值计算• URO update buckets

(separate populations)

Page 12: Building Paragon in UE4

• 优化前后的变化

• 优化后总体快了约23倍

• Update挪到工作线程后计算量依旧,但是不再阻塞游戏线程

Page 13: Building Paragon in UE4

• 同屏角色过多后,传统LODs也不能完全解决问题 (团战)

• Significance系统维护列表中对象的重要度,其中重要度由游戏逻辑决定

• 对不同的游戏对象可以有不同的得分• 允许per-LOD限制 (e.g. 只允许4个英雄使用

LOD1)• 可以基于普通的LOD之上,由Significance来额

外修正

• Significance的评分可由gameplay和其他系统读取

Page 14: Building Paragon in UE4

• 大量减少单角色的component数量• 减少ActorComp带来的transform更新计算

• AI在DS上使用nav mesh做碰撞

• 降低AI的网络更新频率(net freq)• 旋转在客户端做插值• 改进了变量延迟低频更新的插值处理

• 在数据同步中,也利用significance系统做了个网络的LOD方案,对视觉上不重要的对象,降低更新频率

• 对于某些LOD,客户端不做碰撞检测

Page 15: Building Paragon in UE4

• 我们希望塑造丰富动态的角色, 需要很多物理对象

• PhysX太重,太多bodies后scenes太复杂

• 写了我们自己的刚体结算器: “AnimDynamics”• 不支持碰撞• 无物理场景管理• 不阻塞游戏线程• 不和其他物理对象产生交互• 可配置的刚体约束

• 棱柱和角约束• 平面约束

• 作为一个AnimBP的node

Page 16: Building Paragon in UE4

• 使用Nvidia的APEX

• 和Nvidia合作改进效率• 从per-scene的模拟改成了per-cloth• 这样更容易控制单个角色的布料计算开销• 去掉了APEX中部分不必要的冗余开销

• Cloth的准备工作移到了工作线程

• 比之前的版本快了10~15倍

Page 17: Building Paragon in UE4

• 尽可能避免不必要的scene query,改进了overlap

• 改进Rotator <-> Quaternion转换• 转换代码的优化 (SIMD + 近似)• 大量减少转化发生的次数

• 修改部分组件接口,减少虚函数调用

• 减少内存分配,对某些分配使用stack allocator

Rot/Quat Conv. (50 chars)

Before After

R -> Q 362 5

Q -> R 206 0

Page 18: Building Paragon in UE4

• 持续跟踪不同版本中Tick的Actor数

• 使用Time Manager或者其他手段手动降低部分对象的tick频率

• 手动Tick部分对象• 降低Task Graph的overhead以及

提升缓存一致性

• 尽可能的降低任务间的依赖关系,来减少Task Graph的开销

Page 19: Building Paragon in UE4

• 对粒子的初始化进行了优化,在cook阶段进行了尽可能多的预计算

• 当激活/失效粒子的时候,自动attach和detach对应的component

• 减少不激活状态不必要的transform更新

• 很多特效对象由游戏逻辑动态生成(并不attach在actor上)

• 纯客户端触发• 和自动的attach/detach配合

Page 20: Building Paragon in UE4

• 核数: 4-8+• 使用引擎中的task graph• 拆散数据并行的passes 以改善负载平衡

e.g. EarlyZ / BasePass / Shadows / InitViews / Translucency• 平台无关的指令列表• 并行的指令列表生成 (DX11, PS4, XB1, DX12, Vulkan)• 尽可能的并行指令列表转换 (PS4, XB1, DX12, Vulkan)• 有序的提交

D

D

D

T

T

T

S

D

D

D

T, T, T S

T

S

D

D, D, D T, T, T S

Page 21: Building Paragon in UE4

• 更好的Texture Streaming结果• 更准确的mips分析• 更快速的Streaming• 更稳定的frame 0质量

• 网络数据压缩• Oodle生成字典• 6kbps上行,23kbps下行• 压缩率30%

Page 22: Building Paragon in UE4
Page 23: Building Paragon in UE4

• 共用了HZB的mips• 利用了TemporalAA来smooth输出• ComputeShader,只用深度缓冲

靠depth buffer重建normal *低面内容有刻面

• AsyncCompute和BasePass并行,更好的利用额外的gpu处理单元

• PlayStation 4• 单pass1600x900, 无双向上采样• PixelShader 0.50 ms

ComputeShader 0.65 msAsyncCompute 0.2 ms

Page 24: Building Paragon in UE4

• 为了DBuffer decals,把CustomDepth放到了Gbuffer生成前(r.CustomDepth.Order)DBuffer: 烘培的静态光照可影响DecalsCustomDepth: 特定的z buffer (支持256 stencil)

• Paragon用来:• 角色身上的技能效果,物品效果,buff效果• 全屏的pass来高亮墙后的角色• 环境Decals• 特效(地上的技能范围等)

Page 25: Building Paragon in UE4

• 需要降低:• 顶点数• 面数(Quad overdraw)• Draw calls (合并材质)

• Skeletal meshes (5 LODs)• 高模烘培贴图• runtime使用从lod1开始• 测试:Simplygon• 手动 & 3DSMax Pro Optimizer

• HLOD (Simplygon)• 在场景95%完成度后• 合并mesh• 合并材质• 烘培贴图属性

1024 diffuse, 512 normal/metal/spec/roughness

Page 26: Building Paragon in UE4
Page 27: Building Paragon in UE4
Page 28: Building Paragon in UE4

• 静态投影 (Lightmass)• 预先烘培的distance field shadows• PreShadows• 低开销的单采样PreShadows

• Per object shadow maps• 对于Skinned mesh的Capsule shadows

• 类似ragdolls的设置• 直接shadowing

• 方向基于接收这到光源的方向• 柔和度来自 SourceRadius / SourceAngle• 在预烘培的光照环境下有非常柔和的阴影

• 间接shadowing• 方向和柔和度都来自lightmass烘培的volume light cache

• 再较低的精度上做计算

Page 29: Building Paragon in UE4

Particle Cutouts• 半自动的引擎功能• 更具texture内容和设定的alpha阈值• 降低半透粒子的Overdraw / PixelShader开销• 能用在SubUVAnimation• 用了更多的顶点/面• 不改变原始贴图资源

Page 30: Building Paragon in UE4

Posters• 角色的teaser视频

• 4K• 高渲染设置• 3S皮肤,毛发,眼球渲染• 强烈的DoF

• Lighting Channels

Page 31: Building Paragon in UE4

User Interface

• 尝试过3D UI• 60 fps,部分更新频率更低• 与3D分辨率无关,独立的缩放• Unreal Motion Graphics (UMG)

• SMeshWidget• 在3DSMax中制作的3D mesh• 支持Hardware instancing• 材质中2D距离用来计算ddx/ddy做

AAA

• Other UMG widgets• 用UE4的UMG工具制作

Page 32: Building Paragon in UE4

未完

其他大量的改进

Page 33: Building Paragon in UE4

Bonus 1/2

Page 34: Building Paragon in UE4

Bonus 1/2Name Help

r.ParallelBasePass Toggles parallel base pass rendering. Parallel rendering must be enabled for this to have an effect.

r.ParallelInitViews Toggles parallel init views. 0 = off; 1 = on

r.ParallelPrePass Toggles parallel zprepass rendering. Parallel rendering must be enabled for this to have an effect.

r.ParallelShadows Toggles parallel shadow rendering. Parallel rendering must be enabled for this to have an effect.

r.ParallelShadowsNonWholeScene Toggles parallel shadow rendering for non whole-scene shadows. r.ParallelShadows must be enabled for this to have an effect.

r.ParallelTranslucency Toggles parallel translucency rendering. Parallel rendering must be enabled for this to have an effect.

r.ParallelVelocity Toggles parallel velocity rendering. Parallel rendering must be enabled for this to have an effect.

r.RHICmdUseParallelAlgorithms True to use parallel algorithms. Ignored if r.RHICmdBypass is 1.

r.RHICmdBypass Whether to bypass the rhi command list and send the rhicommands immediately.0: Disable (required for the multithreaded renderer)1: Enable (convenient for debugging low level graphics API calls, can supress artifacts from multithreaded renderer code)

Page 35: Building Paragon in UE4

We’re Hiring

Page 36: Building Paragon in UE4
Page 37: Building Paragon in UE4