本系列为Epic官方视频[UOD2020]厚积薄发,祖龙使用UE研发开放大世界的实践简介 | 祖龙 王远明(官方字幕)笔记。

如何用UE4开发移动端的无缝大世界?重点是:如何使用UE4和Houdini配合的工作流以及大世界的运行加载体制以及优化。

概述

  • 挑战
  • 解决方案
  • 优化(性能、内存)
  • 开发迭代(工具、迭代过程)

超大世界MMO的优势

  • 更加真实的游戏体验
  • 更加丰富的游戏玩法
  • 减少频繁的场景加载

大世界需要解决的问题

场景的创建、编辑和开发迭代

  • 真实地形地貌(手刷很难真实)
  • 多人协同
  • 接缝
  • 光照(由于分成不同块,如果一棵树在多块场景中投射阴影,那么在烘培单一场景的时候就需要做一些额外处理)
  • 二次编辑
  • 工作流(控制包体大小)
  • 大范围植被(创建、渲染)

场景实时加载和卸载

  • 加载卡顿
  • 内存(模型、贴图、地块、远景)

运行效率

  • GPU(面数、DC)
  • CPU(场景管理逻辑、模型Tick)

解决方案

Houdini创建真实地貌

  • 基于节点模式(经过节点层层计算,最终呈现出一个最终形态,当修改了节点后,地形的计算结果会实时变化)
  • 所有的操作都是通过HDA文件保存(比如创建河流)
  • 大世界的创建和拆分
  • 分块加载和编辑
  • 边界融合
  • 跨分块对象(路、河流)
  • 植被系统
  • 场景LOD
  • 场景发布
  • 场景迭代
  • 工作流

大世界的加载机制

  • 视距无限远
  • 加载不同的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拷贝次数

大世界的创建和拆分

UE4
  • 大世界->区域(沙漠、雪地、绿洲)->最小的编辑单位
  • 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-几十米(参数调整)
UE4

跨分块对象

  • 河流、海、路
  • 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)