目录
Component Instancing
Instanced Static Mesh Component
Instanced Static Mesh
Differences of an ISM and a Static Mesh Component
Hierarchical Instanced Static Mesh
Instancing Systems
Working with ISMs
Prefabrication
Custom Data
Creating and Editing ISMs
组件(Component)是可以添加给Actor的一项功能;当为Actor添加组件后,Actor就可以使用组件提供的功能;如:
- "聚光源(Spot Light)组件"将使Actor像聚光源一样发光;
- "旋转运动(Rotating Movement)组件"将使Actor旋转;
- "音频(Audio)组件"将使Actor能够播放声音;
与Actor不同,组件不能单独存在,只能绑定在Actor身上;
为Actor添加组件的过程,相当于为Actor添加各个零件;例如,一辆汽车(Actor)由车轮、方向盘、车身、车灯等(组件)组成;再例如,玩家角色Actor通常包含一个单独的"骨骼网格体(Skeletal Mesh)"组件(表示角色外观)、跟随角色移动的摄像机,以及接收玩家输入的控制器;
添加完构成Actor的不同组件后,即使不提供指示Actor应如何运行的任何 蓝图(Blueprint)脚本(或C++代码),也可以将Actor放置在关卡中;在上面的示例中,汽车(Actor)可以作为对象存在于世界(关卡)中,无需任何驱动程序(蓝图或C++代码)告诉它要执行什么操作;然后,可以使用蓝图或C++代码单独访问汽车的每个组件(例如,如果按下油门组件,蓝图逻辑可以使汽车加速);
Component Instancing
与一般子对象的默认行为不同,Actor中充当子对象的各种组件都是实例化的,所有某个类的Actor实例都有着单独的组件实例;
为了理解这点,想象一下上面的汽车示例;一个"汽车(Car)"类使用组件来表示汽车的车轮;四个"车轮(Wheel)"组件是该类的默认属性中的四个子对象,并指定给了"车轮(Wheels)"数组。当创建新的汽车实例时,会专门为该汽车实例新建"车轮(Wheel)"组件实例;否则,当世界中一辆汽车移动时,所有汽车的车轮都会转动;这显然不是预期的行为;让组件默认进行实例化,免去了为Actor添加唯一子对象的麻烦;
Instanced Static Mesh Component
Actors的数量会影响性能,可以将相同的网格体打组到一个actor中作为实例化静态网格(ISM)组件,而不是在关卡中重复使用静态网格体actor;
Instanced Static Mesh
ISM是一个包含一组相同静态网格的组件,组件中的每个静态网格代表静态网格资源的一个实例;ISM帮助提升性能,如降低 UOBjects 的内存;
Details Panel
一个 instanced static mesh 是一个actor的组件,可在Details Panel内查看;另外,可在细节面板内查看和修改:
- 被应用于actor组件的 static mesh 资产;
- 组件内实例的数量;
- 所有实例使用的材质;
- 自定义每实例数据;
- LOD;
- 实例culling距离;
- 面板中常见的其他属性;
Differences of an ISM and a Static Mesh Component
当拖拽一个 static mesh asset 到关卡内,引用该资产的 static mesh actor 将自动被创建;一个actor内的每个static mesh通过组件引用;默认,当拖拽一个 static mesh asset 到关卡内,一个 static mesh component 被应用;
- Static Mesh Component,具有自己的变换、材质和碰撞的单个静态网格表示;
- Instanced Static Mesh Component,表示指定的静态网格的多个实例,共享相同的材质和碰撞特性;通常用于更有效地渲染使用不同的变换的相同静态网格;
Hierarchical Instanced Static Mesh
传统上,分层实例化静态网格(HISM)为每个实例唯一应用细节级别(LOD),而ISM则将LOD应用于整个组件边界;但对于在5.4或更高版本中创建的项目,可以为ISM的每个实例使用LOD;
LOD是同一网格在不同三角形数下的数组,具体取决于其在视口中的屏幕空间;减少三角形计数有助于减少计算时间,提高优化效率;可在Details panel调节ISM和HISM的LOD;
HISM和ISM的不同:
- 如有1000个不移动的实例,HISM可能更好;在这种情况下,使用静态层次结构来加速culling和LOD过程;
- 如有许多不完全静态的实例,则使用HISM的项目中可能会出现错误;
- ISM没有静态层次结构,必须在GPU上cull & LOD每个实例,这在低功耗平台上可能很昂贵;
- 如希望LOD与静态网格行为相匹配,则不能依赖HISM,因为它会处理多组实例;当单个LOD不是很重要时,HISM最有用;例如,具有少量三角形的网格;
- 如项目只使用Nanite,那么ISM总是你的选择,因为Nanite有自己的culing和LOD系统;
Instancing Systems
虚幻引擎提供了将实例优化应用于网格的系统;这些系统(如Nanite)的使用取决于项目和目标平台;
- Dynamic Instancing,通过组合具有相同材质和网格的静态网格绘制,可以减少绘制调用;
- Nanite,虚拟化几何系统,其中框架预算不再受多边形计数、绘图调用和网格内存使用的限制;可以在ISM和HISM组件中引用启用了Nanite的网格;
- Procedural Content Generation,程序生成内容的框架;
- Niagara,创建视觉效果的系统,在渲染时实例化粒子网格体;
Working with ISMs
ISM的主要功能是提高项目的性能;如果逐一复制每一片树叶,绘制森林的速度会非常慢;使用Folage Mode等工具,可以通过同时放置多个分组实例来节省工作流和计算时间;
Prefabrication
将相同的静态网格分组到一个组件中,是设计优化关卡的有价值的工作流程;ISMs可以帮助完成关卡设计,例如在环境中放置背景道具或重复建筑实例以创建塔楼;
这种类型的预制与合并网格以创建新的静态网格资源的工作流程不同,因为每个实例都是相同的、可选择的,更新一个实例会更新所有实例;
Custom Data
ISM可使用 Custom Primitive Data 和 Per Instance Custom Data 去降低绘制调用,通过传递数据而不为每个网格生成新的动态材质实例;可使用蓝图读取数据进入材质并管理它;
- Custom Primitive Data,储存在primitive上的额外浮点数据;
- Per Instance Custom Data,每实例的额外浮点数据;
Creating and Editing ISMs
Instance Selection
- 控制台命令 TypedElements.EnableViewportSMInstanceSelection ;
- 细节面板内的 Instances 选项;
- ISM编辑器;
Blueprints 可使用一个蓝图actor来添加ISM或HISM;
Merge Actors 由多个合并static mesh actor工具组成,其中之一Batch;
Harvest Instances Tool 选择static mesh actors批量处理以创建ISM或HISM组件;
Foliage Mode 用于放置static mesh和actor foliage,以快速填充大型环境;
Packed Level Actor 从蓝图创建packed level actor,有助于创建预制对象;
Pattern Tool 工具Pattern技术创建mesh并作为ISM输出,此工具有以下类型single actors, dynamic mesh, instanced static mesh;
ISM Editor 选择ISM组件的实例并执行变换,也可添加、替换、删除实例;