本系列为Epic官方视频[UOD2020]厚积薄发,祖龙使用UE研发开放大世界的实践简介 | 祖龙 王远明(官方字幕)笔记。
如何用UE4开发移动端的无缝大世界?重点是:如何使用UE4和Houdini配合的工作流以及大世界的运行加载体制以及优化。
概述
- 挑战
- 解决方案
- 优化(性能、内存)
- 开发迭代(工具、迭代过程)
超大世界MMO的优势
- 更加真实的游戏体验
- 更加丰富的游戏玩法
- 减少频繁的场景加载
大世界需要解决的问题
场景的创建、编辑和开发迭代
- 真实地形地貌(手刷很难真实)
- 多人协同
- 接缝
- 光照(由于分成不同块,如果一棵树在多块场景中投射阴影,那么在烘培单一场景的时候就需要做一些额外处理)
- 二次编辑
- 工作流(控制包体大小)
- 大范围植被(创建、渲染)
场景实时加载和卸载
运行效率
- GPU(面数、DC)
- CPU(场景管理逻辑、模型Tick)
解决方案
Houdini创建真实地貌
- 基于节点模式(经过节点层层计算,最终呈现出一个最终形态,当修改了节点后,地形的计算结果会实时变化)
- 所有的操作都是通过HDA文件保存(比如创建河流)
- 大世界的创建和拆分
- 分块加载和编辑
- 边界融合
- 跨分块对象(路、河流)
大世界的加载机制
- 视距无限远
- 加载不同的LOD
- 全Lua实现的加载逻辑(没有使用World Composition这个引擎自带的加载逻辑,这样可以热更新,基于streaming level,可配置)
运行效率
- DC:每个分块中最多有一种类型的Hierarchical instance
- DC:较远处小物件、部分低精度LOD不投射阴影
- DC:分类别设置不同的Culling Distance
- 静态+动态光照:Fully dynamic有较多DC
- 静态+动态光照:远处静态shadowmap
- 静态+动态光照:角色动态阴影
- 静态+动态光照:没有使用lightmap
- 大量使用Hierarchical instance,省内存和DC
- 采用工具自动合批(我理解就是自动勾选Hierarchical instance)。如果出现零星几个特殊物件,则提示是否必须保留。
- LOD2将不同物件进行合并(我理解使用HLOD)
- 减少实时点光
- 卡顿:无法过多preload,所以需要大量异步加载
- 内存:mipmap剔除(去掉冗余的、或者精度比较高的mipmap级别)、减少模型种类
- 内存:将资源分入不同的streamingLevel(内存大的手机使用更多streaminglevel)
- 内存:制作简化的碰撞体
- CPU:Disable不必要对象的update
- CPU:网络协议buffer拷贝次数
大世界的创建和拆分
- 大世界->区域(沙漠、雪地、绿洲)->最小的编辑单位
- Tile.hda为最小加载单元
- Tile.hda会对应UE4的ULevel
分块加载和编辑
- Tile.hda为最小加载单元
- Tile.hda会对应UE4的ULevel,在Level中会有一个叫做UHoulandProxy的Actor,作为和Hda交互的桥梁。
- 在Proxy身上,可以通过Houdini插件提供的api,编辑当前分块的hda,编辑好之后(每次编辑都以节点的方式保存修改,每个节点就是一个以Hda文件形式保存的Houdini文件),通过Houdini的API产生最终的程序化数据,再用这个程序化数据刷新UE4的地形,这样通过UE4的引擎将地形地貌渲染出来。
- 每次编辑都是以节点形式保存修改,每个节点都是一个HDA文件
- 在Level中,其他常规对象,比如一个建筑、一个光源、策划需要的东西,都是使用常规的UE4编辑器的方式来编辑,只有地形地貌使用Houdini的方式编辑
边界融合
- Tile间的融合(易):高度的融合(对接,做一些随机处理)
- Tile间的融合:地表纹理的融合(混合0-1渐变,范围1-2米)
- 区域融合(难,因为风格差异比较大):高度除了Tile融合调整之外,还会做一个比较大的扭曲。
- 区域融合:增加过度范围,范围10-几十米(参数调整)
跨分块对象
- 河流、海、路
- UE中有相应的Actor用于图形化操作
- 数据被保存在HDA文件中,调用Houdini API影响大地行的生成
- 路其实就是大地形的一部分。河流、海,Hounidi根据参数负责河床的生成,以及河床的效果。并生成河、海对应的mesh(生成后的mesh与houndini无关了)
大范围植被
- 由Houdini程序化生成植被信息
- 由插件根据Houdini程序化生成的植被信息来修改UE的Landscape里面的Grass Type数据
- 之后,在UE原有功能,生成每个地表上的植被系统。
- 根据自定义的grassArea,决定哪里长草,哪里不长。
场景发布
- 先将Houdini所有操作节点应用,生成最终效果
- 产生UE相关uasset
- 计算Tile的各个LOD(LOD1中景和LOD2远景)
- Cook每个Tile的光照信息
场景迭代
- 尽量不要修改整个世界的地貌,大世界.hda
- 如果要修改,则需要拆分世界,然后将节点应用于拆分后的hda文件,这样工作量也能省一点
Houdini和UE4配合使用建议
- 需要实时预览场景,则在编辑器中通过houdini插件编辑地形。因为在Houdini中看不到UE相关物件,甚至贴图混合
- 如果只需要在Houdini操作,就在Houdini操作(编辑地形等,这样不用等UE的显示更新)
- 原则上发布的ULevel不允许直接编辑,以防修改后被之后的发布覆盖。
王弥:《UE4制作多人大地形游戏的优化》。覆盖:物理、动画、渲染、网络
- World Composition->World Partition(根据参数分割完的分块地形:自动host上面的数据:navmesh、spline mesh怎么切分、instance static mesh切开、level instance、HLOD)
- 与SideFX合作,改进过程式生成、复杂地形的工作流和功能
虽然并非全部原创,但还是希望转载请注明出处:电子设备中的画家|王烁 于 2020 年 12 月 28 日发表,原文链接(http://geekfaner.com/ue4/blog8_UOD2020_3.html)