如何建网站赚钱,网站建设前期规划,广州网站策划公司,asp装修网站源码研究思路#xff1a;GPUAnimation把动画放入GPU中处理#xff0c;BatchRendererGroup进行动态批量渲染处理#xff0c;JobsBurst进行多线程处理逻辑#xff08;移动、攻击等#xff09;#xff0c;RVO2采用Jobs的寻路导航。
准备工作#xff1a; Editor Project S…研究思路GPUAnimation把动画放入GPU中处理BatchRendererGroup进行动态批量渲染处理JobsBurst进行多线程处理逻辑移动、攻击等RVO2采用Jobs的寻路导航。
准备工作 Editor Project Setting Package Manager Enable Pre-release Package勾选 PackageManager安装以下Jobs、Burs、Universal RP URP渲染管线
RenderingCreate “Universal Render Pipeline Asset” EditorProject SettingQualityRenderPipelineAsset“Universal Render Pipeline Asset” EditorProject SettingGraphicsScriptsableRenderPipelineSetting“Universal Render Pipeline Asset” Job System C#任务系统
在Job System对外之前Unity虽然内部是多线程处理但是外部的代码都必须跑在主线程上。C虽然支持Thread但是在Unlty中只能处理数据例如网络消息、下载。如果想在Thread中调用Unity的API那是不行的。有了Job System就可以充分利用CPU的多核例如在多线程中修改Transform旋转、缩放、平移例如MMO游戏判断碰撞、大量同步角色坐标、大量的血条飘字等都比较适合Job SystemUnity没有直接将Thread开放出来可以有效避免Thread被滥用开发者可放心使用Job而不用太多关心如线程安全、加锁这些问题。Job最好配合Burst编译器这样能生成高效的本地代码后面会细聊Burst
job中只能使用值类型floatintuintshortbool。。。enumsstructs和其他类型的指针。 job中不能使用引用类型T[]数组属于引用类型无法使用使用NativeArrayT[]替代。
所以:接口IJob是个开线程的操作再job中按顺序执行所以可以准确的保证值的准确性 //在job中按顺序执行所以可以准确的保证值的准确性struct MyStruct : IJob{public NativeArrayfloat values;public float offset;public void Execute(){for (int i 0; i values.Length; i){values[i] offset;}}}void Update(){NativeArrayfloat values new NativeArrayfloat(500, Allocator.Persistent);MyStruct myStruct new MyStruct();myStruct.values values;myStruct.offset 10;for (int i 0; i 1000; i){JobHandle jobHandle myStruct.Schedule();jobHandle.Complete();}values.Dispose();}
接口IJobParallelFor在job中按并行执行内部会自动加锁 //在job中按并行执行内部会自动加锁struct MyStruct2 : IJobParallelFor{//声明数据是只读的意味着copy这个数据不需要加锁[ReadOnly]public NativeArrayfloat copy;//非声明ReadOnly默认values为write/read数据一旦改变job会等待public NativeArrayfloat values;public void Execute(int index){values[index] copy[index];}}void Update(){NativeArrayfloat values new NativeArrayfloat(500, Allocator.Persistent);NativeArrayfloat copy new NativeArrayfloat(500, Allocator.Persistent);for (int i 0; i copy.Length; i){copy[i] Random.Range(0, int.MaxValue);}MyStruct2 myStruct new MyStruct2();myStruct.values values;myStruct.copy copy;for (int i 0; i 1000; i){JobHandle jobHandle myStruct.Schedule(values.Length, 32);jobHandle.Complete();}values.Dispose();copy.Dispose();} Burs编译器
Burst编译器是以LLVM为基础的后端编译技术。编译器的原理会分5个步骤源代码—》前端—》优化器—》后端—》机器码。LLVM的定义了个抽象语言IR前端负责将源代码C编译成IR优化器负责优化IR后端负责将IR生成目标语言这里就是机器码。正是因为抽象语言IR的存在所以LLVM支持的语言很多而且也方便扩展C、ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Rust、Scala等 语言。LLVM代码是开源了所以Unlty很适合用它来做Burst的编译。遗憾的是LLVM对C的GC做的不好所以burst只支持值类型数据编译不支持引用类型数据编译
Unity.Mathematics数学库
Unity.Mathematics提供矢量类型float4float3它可以直接映射到硬件SIMD寄存器。Unlty.Mathematics的Math类中也提供了直接映射到硬件SIMD寄存器。这样原本CPU需要一个个计算的有了SIMD可以一次性计算完毕。需要注意的是unlty之前的Math类默认是不支持映射SIMD寄存器的。 如何启动BursCompile我们可以在C#代码中使用Burst编译器。在需要使用Burst编译器的方法或类上添加[BurstCompile]属性。 我们需要在Unity3D项目的Player Settings中启用Burst编译器。在Unity3D编辑器中选择Edit - Project Settings - Player在Inspector窗口中找到Scripting Backend选项选择IL2CPP并勾选“Enable Burst Compilation”选项即可。
Struct上添加BursCompile即可。Struct必须是继承IJob类否则无效。 //在job中按顺序执行所以可以准确的保证值的准确性[BurstCompile]struct MyStruct : IJob{public NativeArrayfloat values;public float offset;public void Execute(){for (int i 0; i values.Length; i){values[i] offset;}}} 设计模式-组合模式: 类似GameObject上绑定组件组件化。 未完待续