【博物纳新】超级变变变,万人同屏开源库推荐!

【博物纳新】是UWA重磅推出的全新栏目,旨在为开发者推荐新颖,易用,有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目,前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

更多精彩内容请关注:lab.uwa4d.com


导读

Unity引擎在其2017.3版本中引入了C#Job System,Burst Compiler以及实体组件系统,使得开发者能够利用CPU的多核硬件并行处理游戏逻辑,大大提升了游戏效率。今天给大家介绍的开源库是Unite Austin会议上展示的Nordeus Demo,该演示通过利用上述技术实现了PC平台上数以万计角色同屏的效果。传送门。本文以该演示为例,主要介绍了Unity三大功能的使用方法,并对该演示的性能进行测评,显示了其在提升游戏逻辑执行效率的效果
请输入图片描述


一,工作系统和ECS和连拍

随着PC和移动平台CPU的核心数增加,如何在游戏开发中利用多核的计算能力提高运行效率成为游戏引擎需要解决的主要问题之一。当开发者能够将原本运行在单一线程的游戏逻辑任务分割成块,并且利用CPU的多核硬件并行处理时,就能大大提高游戏逻辑的执行效率。

Unity引擎在其2017.3版本中引入了C#Job System,Burst Compiler以及实体组件系统。其中,C#Job System为开发者提供了高性能的多线程编程框架,使得开发者能够利用CPU的多核硬件,让游戏运行的更加流畅。在该过程中,各个线程执行的时间(线程时间)虽然没有发生变化,但并行执行使得实际执行任务的时间(Wall Time)减少了,如下图所示:其中,三个任务(工作1,工作2,工作3)放在了不同线程并行执行,总的线程执行时间是三个任务执行时间之和,即6.9ms。而由于利用了多线程,任务实际执行时间只有4.6ms。
请输入图片描述

除了使用C#Job System的多线程框架减少Wall Time,配合Burst Compiler和Entity Component System能够减少各线程的线程Time.Entity组件系统将游戏逻辑中使用的内存按照更适合CPU缓存的方式进行排列,通过提高访问时缓存的命中率提高代码执行效率.Burst Compiler则是通过对C#代码编译进行优化提高运行效率。结合两者以及C#Job System能够大大提高游戏逻辑的运行效率。


二,Nordeus Demo

C#Job System中最常用的一种多线程并行编程方式就是使用ParallelFor Jobs,如下文代码段所示:

 1public struct MinionFlightJob : IJobParallelFor
 2{
 3    public ComponentDataArray<UnitTransformData> flyingUnits;
 4    public ComponentDataArray<TextureAnimatorData> textureAnimators;
 5    public ComponentDataArray<RigidbodyData> rigidbodies;
 6    public ComponentDataArray<MinionData> minionData;
 7
 8    [ReadOnly]
 9    public NativeArray<RaycastHit> raycastHits;
10
11    [ReadOnly]
12    public float dt;
13
14    public void Execute(int index)
15    {
16        var rigidbody = rigidbodies[index];
17        var transform = flyingUnits[index];
18        var textureAnimator = textureAnimators[index];
19
20        textureAnimator.NewAnimationId = AnimationName.Falling;
21        transform.Position = transform.Position + rigidbody.Velocity * dt;
22        rigidbody.Velocity.y = rigidbody.Velocity.y + SimulationState.Gravity * dt;
23        // add damping
24
25        if (transform.Position.y < raycastHits[index].point.y)
26        {
27            var minion = minionData[index];
28            minion.Health = 0;
29            minionData[index] = minion;
30        }
31
32        rigidbodies[index] = rigidbody;
33        flyingUnits[index] = transform;
34        textureAnimators[index] = textureAnimator;
35    }
36}

上文代码段显示了Demo中,小怪被炸飞的表现效果代码,其中用到了IJobParallelFor类.ParallelFor Job主要用于处理大量相同逻辑的计算任务。这些计算任务被分配在不同的线程上,利用CPU的多核硬件进行并行计算。通常情况下,需要计算任务的数量远远大于线程数。因此,每个线程会处理多个计算任务。当某一线程完成的速度快于其他线程时,系统会自动从其他线程重新调配计算任务到该线程。

如果配合实体组件系统使用,则通常需要用到JobComponentSystem,如下文代码段所示:

 1public class FlightSystem : JobComponentSystem
 2{
 3    public struct FlyingUnits
 4    {
 5        [ReadOnly]
 6        public ComponentDataArray<FlyingData> flyingSelector;
 7        public ComponentDataArray<UnitTransformData> transforms;
 8        public ComponentDataArray<RigidbodyData> rigidbodies;
 9        public ComponentDataArray<MinionData> data;
10        public ComponentDataArray<TextureAnimatorData> animationData;
11
12        public int Length;
13    }
14
15    [Inject]
16    private FlyingUnits flyingUnits;
17
18    private NativeArray<RaycastHit> raycastHits;
19    private NativeArray<RaycastCommand> raycastCommands;
20
21    protected override void OnDestroyManager()
22    {
23        ...
24    }
25
26    protected override JobHandle OnUpdate(JobHandle inputDeps)
27    {
28        ...
29    }
30}

其中,关键之处在于存储实体数据的方式与以往不同。在上图显示的组件系统代码中,每一个实体的数据被存储在一系列ComponentDataArray容器里。因此,当CPU需要访问这些数据时,由于其存储的连续性,能够更好的利用CPU与内存之间的缓存机制,提高执行效率。具体的代码实现细节,我们不再赘述,请读者参考演示的C#脚本。

使用Burst Compiler则更加方便,如下图所示:只需要在编辑器的工作菜单中,选择UseBurst Jobs即可。
请输入图片描述


三,性能测试

为了展示C#Job System,ECS以及Burst Compiler方案的运行效率,以及Burst Compiler带来的性能提升,我们比较了开启使用Burst Jobs之前与之后的性能数据以及场景中创建不同数量角色时的性能数据。 Burst Compiler目前只能在编辑器中使用,因此我们的测试数据均来自编辑运行结果。

测试平台:
系统:Win10
内存:16G
CPU:Intel(R)Core(TM)i7-6700HQ CPU @ 2.6GHz
GPU:NVIDIA GeForce GTX 1070

1)开启使用突发作业:

请输入图片描述
请输入图片描述

上图显示了演示运行时的FPS以及探查截取的其中一帧函数耗时堆栈信息。由上图可知,耗时较高的依然是Camera.Render函数,即渲染逻辑。由于使用了多线程,ECS以及Burst Compiler的优化,与角色相关的更新逻辑只占用主线程中非常少的耗时(红色方框)。大量的计算任务过程被分配给了工线程,如下图所示:
请输入图片描述

利用大量工人线程的并行计算结合ECS和Burst Compiler,角色逻辑计算耗时被大量压缩。同时,Demo在渲染角色时采用了GPU Instancing,因此渲染的耗时也被降低到5ms以内。

2)关闭使用Burst Jobs:
请输入图片描述
请输入图片描述

上图显示了不开启使用Burst Jobs时,Demo运行时的FPS以及Profiler截取的其中一帧函数耗时堆栈信息。其中,时间开销最高的函数是CommandSystem的UpdateFunction.Invoke(红色方框)。主要负责的是Demo中角色攻击指令相关的逻辑,例如:寻找最近地方单位等。由此可见,在不开启使用Burst Jobs时,游戏逻辑的耗时变得非常高。

请输入图片描述

上图显示了不开启使用Burst Jobs时间线的显示结果。由上图可知,在不使用Burst Compiler进行代码优化的情况下,即使采用多线程进行并行计算以及ECS Cache友好的内存分布,仍然造成了解各线程的计算耗时太高,从而导致每一帧总体的耗时过高。因此,Burst Compiler对于C#代码的优化起到非常重要的作用。

3)不同角色数量:
请输入图片描述

 

上图显示了在开启使用Burst Jobs时,创建不同角色数量对应的帧率。由上图可知,在测试PC上,创建65000个角色同屏依然能够达到33帧的效率。

综合上述Demo中使用的功能介绍和实验结果,可以发现:Burst Compiler对于代码的优化带来的性能提升是非常明显的。配合C#Job System以及ECS则更能能将游戏逻辑的执行效率大量提升。同时,为了达到海量角色同屏的效果,在渲染和动画方面可以采用GPU Instancing以及Bake Animation的方式进一步减少渲染逻辑的CPU开销。

开源库传送门:
https://lab.uwa4d.com/lab/5bc550f804617c5805d4e9c1


今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路〜请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。


快用UWA Lab合辑Mark好项目!

请输入图片描述

超级大屏幕 查看更多关于 超级大屏幕 的文章 具有开幕墙、闭幕墙、消息墙、抽奖、签到、嘉宾展示、抢红包功能,利用开幕墙对整个活动的展示介绍、也适合活动进行中的间歇时间、消息墙可以再等待和互动的时候,让员工发布消息,是一款非常流行的微信大屏幕系统。 重要说明:付费报名模式目前只支持开通微信支付的服务号。 1、本模块支持开幕墙、闭幕墙、消息墙、二维码扫描墙、3D签到墙(支持logo签到和文字签到)(4种展示效果)、多奖品切换现场抽奖、酷炫互动疯狂抢红包、嘉宾墙等,后续将再新增多个墙,敬请期待; 2、每个大屏幕都支持自定义背景、和背景有音乐功能,购买的客户将免费赠送背景素材包; 3、现场抽奖奖品支持同时设置多个奖品,并且可以设置每个奖品的顺序,方便根据奖品价值安排抽奖顺序,奖品支持实物和红包(); 4、抢红包奖品支持实物、微信卡券、红包等,支持自定义奖品数量、概率等; 5、抢红包支持设置每个人最多中奖次数、超过了就不会再中奖了; 6、抢红包活动支持设置赞助商广告,粉丝的中奖提示页面会弹出赞助广告; 7、抢红包活动支持多波活动举办,支持一波活动结束后直接重置,之前中奖的数据不会被清空,后台和中奖者手机端都可以看到并且兑换红包。 8、红包奖品支持直接发送和提现两种模式,方便做大额红包奖励。 9、3D签到墙支持4种展示方式,前后台都可以自由切换,手机端签到可以支持是否需要填写个人信息,个人信息支持填写姓名、手机、公司/职位等; 10、大屏幕支持设置密码才能访问的功能; 11、消息墙支持开启是否需要消息审核的功能,支持同时发生消息和图片的功能,并且支持图片再显示的时候是否自动放大功能。 12、后台支持自定义活动流程说明,方便参与者再手机端直接查看活动流程。 13、支持开启和关闭强制关注才能参与活动的功能; 14、自带LBS限制地区功能,可以设置参与人的地区范围; 15、本模块只支持认证服务号使用(使用红包功能必须开通微信支付),其他非认证服务号的可以借用权限(借用权限的账号无法使用卡券功能);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值