UE4 GameThread优化总结笔记
- 游戏信息
- 发布时间:2025-05-06 12:28:34

在面对开放大世界、100名玩家同场竞技的挑战时,优化GameThread成为了关键。Significance Manager作为优化的核心,依据玩家距离、屏幕大小和可见性等信息,将玩家分配到不同的Significance Bucket,每个Bucket具有MaxSize和优先级。这使得游戏业务与LOD计算紧密结合,如玩家身后看不到的玩家优先级较低,视野内的玩家优先级较高。Significance Manager还能驱动其他Scalability Systems,例如在不同平台或机型上设置不同Bucket参数,提供灵活的配置。
在《Fornite》中,角色由Base Skeleton、头、身体、背包和武器组成,每部分有独立的动画蓝图,从Base Skeleton CopyPose后进行特定处理。这套方案在灵活性方面表现出色,但对运行效率构成挑战,因为涉及到大量骨骼Mesh的运行。最初考虑的备选方案包括Mesh合并、Master-Slave方式等,但最终选择将Event Graph移至C++实现,以减少开销。引入Fast Path,将计算分发到Worker Thread,同时利用AnimInstanceProxy优化游戏逻辑更新,实现了更高效的多线程处理。
动画优化包括改进Event Graph至C++、应用Fast Path减少虚拟机调用开销,以及利用MeshComponentUpdateFlag跳过不必要的Pose更新。针对动画计算效率,加入了针对特定场景的优化,如将动画物体额外添加至StaticRenderPath以加速渲染,以及根据角色距离和重要度调整动画更新频率。动画节点的LOD Threshold也被利用,以避免不必要的计算。
使用RigidBody替换AnimDynamics以提高性能,Bounds的计算方式也被优化,通过Use Parent Bounds减少计算次数。Notify的实现从蓝图移动至C++,批量修改动画使用内置的AnimModifier,同时利用异步API和Significance管理跳过不必要的事件通知。
针对大规模游戏场景的动画优化技术包括官方动画预算插件、动画共享插件以及Niagara模拟大型群体等,分别针对PVP、PVE游戏、无双割草类型游戏以及模拟百人混战的场景。同时,针对移动组件的优化包括SceneComponent的性能改进、Character Movement的客户端预测优化、Spawning操作的蓝图转换和特效粒子池化,以及Tick优化策略,如聚合tick、蓝图到C++转换、降低Tick频率或分帧处理。
音频设置和TextureStreaming功能也被调整以优化性能,通过控制并发数量、并发策略以及根据硬件设备进行LOD设置,实现资源的合理利用。在音频优化中,考虑了SoundCue的设置,以及在不同CPU移动设备上的性能调整,如关闭Reverb、EQ等效果或减少Wave数量。
LevelStreaming技术应用于场景管理,将地图拆分为小部分,仅加载当前视距内的场景,以降低内存占用和场景遍历开销。在事件响应优化中,控制广播事件的响应范围,细化消息处理,部分复杂逻辑转移到C++实现。针对服务器性能优化,使用Replication Graph进行高效数据同步,并合并移动方向和速度一致的RPC包。服务器端关闭动画计算,仅在播放蒙太奇时打开,同时忽略DS(Dedicated Server)上的动画数据。
项目设置中包括忽略DS上的动画数据的选项,以进一步减少性能消耗。在实现这些优化策略时,需要关注蓝图和Lua Tick的合理使用,探索替代方案如Timer、Timelines调整间隔或基于事件响应等,以提高帧率和系统效率。