1.基于DOTS的骨骼骨骼大批量骨骼动画方案及实现
2.老师问问3DMAX骨骼的问题BOne骨骼怎样导出bip
3.DynamicBone(动态骨骼)MagicaCloth的优化策略(4)
基于DOTS的大批量骨骼动画方案及实现
本文主要探讨如何基于Unity的DOTS(Data-Oriented Technology Stack)实现大规模骨骼动画的高效绘制。传统Unity骨骼动画依赖于SkinnedMeshRenderer,源码然而其在绘制大批量角色时,动画GPU绘制效率不高,骨骼骨骼主要瓶颈在于CPU将绘制数据提交给GPU。源码SkinnedMeshRenderer不支持静态合批、动画c答题游戏源码动态合批、骨骼骨骼GPU Instancing,源码导致无法有效解决此问题。动画 已有方案如将动画烘焙为纹理并使用GPU Instancing来绘制骨骼动画,骨骼骨骼但这种方法存在局限性,源码如实现动画淡入淡出(Cross Fade)较为复杂且效率低下。动画而DOTS提供的骨骼骨骼解决方案虽在GitHub示例中已有提及,但其功能尚不完整,源码ios 中国象棋源码需要自行实现一套骨骼动画系统以满足项目需求。动画Unity Roadmap已经预告了Animator的开发,但具体发布时间尚不可知。 本文基于官方的DOTS示例,构建了一个最小可用的骨骼动画播放系统,并在项目中应用。系统源码使用Entities版本为1.0.,推荐使用Unity .3.5f1c1打开。以下为系统构建步骤。1. 骨骼动画基本原理
回顾骨骼动画原理,程序实现时,所有骨骼初始位于模型坐标系原点,便于计算。安卓小应用源码每一帧AnimationClip保存对应骨骼的变换矩阵,标记为[公式]。动画播放时,读取对应骨骼的变换矩阵与顶点初始坐标[公式]相乘,得到顶点最终坐标[公式]。 若程序直接实现骨骼蒙皮动画,美术人员将反对,因所有骨骼置于模型坐标系原点,模型无法观看。因此,美术在模型制作软件中需正常摆放骨骼,初始姿势命名为BindPose,人型模型类似字母“T”,快乐秒赞源码1.8称为T-Pose。模型导出时需连同“从BindPose转换回局部空间的变换矩阵”一同输出。动画播放时,顶点位置需从“BindPose位置”变换至“相对于模型局部空间原点的位置”,再变换至“动画当前帧的位置”。2. 搭建Deformation底层
本文基于Unity官方的DOTS示例进行开发,首先移植示例代码。主要实现步骤包括: Deformation数据:通过Package Manager安装com.unity.entities.graphics包后,运行时自动为SkinnedMeshRenderer生成Entity。组件中重要的是SkinMatrix,用于存储当前帧蒙皮变换后的矩阵,通过PushSkinMatrixSystem提交到GPU。 Deformation蒙皮数据烘焙:将SkinnedMeshRenderer数据烘焙成Entity可访问的php积分系统源码组件数据。最终生成组件包括SkinMatrix、AnimationRequest(用于接收动画请求的DynamicBuffer)、BindPose逆矩阵等。 Deformation骨骼数据初始化:在数据烘焙完成后,单独一个System初始化每根骨骼的Entity组件数据,包括SkinMatrix等。 计算变换矩阵:准备数据后,通过CalculateSkinMatrixSystemBase计算最终变换矩阵。 Shader:直接访问由CPU端传入的二进制byte数据,通过解析ByteAddressBuffer在Shader中使用SkinMatrix数据。实现GPU骨骼蒙皮算法。3. 动画控制
实现动画播放器,包括以下功能:- 自定义动画格式:通过ScriptableObject定义SkinnedMeshAnimationClip,包含位置和缩放曲线、旋转曲线。
- 动画控制逻辑:接收动画播放请求,加载动画片段数据,通过BakedCurve转化为运行时数据AnimationCurveCache,最终设置到骨骼上。
4. 调用播放动画接口
实现接口,通过两步操作让指定角色播放动画。利用Frame Debugger观察,+个角色只有一个Batch,实现了高效绘制。5. 总结
本文构建的DOTS骨骼动画系统,在满足基本功能的基础上,实现了大规模骨骼动画的高效绘制。这套系统在DOTS中补充了基础系统,为使用DOTS制作3D游戏的开发者提供了基础设施,满足了特定项目需求。老师问问3DMAX骨骼的问题BOne骨骼怎样导出bip
3dmax骨骼常见的有默认BONE骨骼CS骨骼 CAT骨骼其中 CS和CAT骨骼 都有自带的绑定姿态配置文件 以及动作文件
比如 CS骨骼的姿态配置文件为.FIG在开启绑定编辑姿态按钮后点保存和读取按钮 输入命名保存读取即可在关闭绑定编辑姿态后 相同位置的按钮 保存读取的是.BIP动画文件
CAT骨骼一样在 不点击开启 动画状态(加入任意动画层 并且按下 绿色向右箭头按钮) 的时候就是编辑状态 编辑完毕可以点主骨骼在修改面板进行预设保存 以后也可以从那里读取 开启后则可以将动画层的数据进行保存 复制 粘贴操作
由此 CS CAT骨骼都是可以直接在一个文件做好以后 用配置文件在其他场景操作即可
唯有例外就是默认骨骼是个例外默认骨骼需要进行群集定义以后才能有上诉功能
DynamicBone(动态骨骼)MagicaCloth的优化策略(4)
首先,让我们跳过官网链接,直接进入MagicaCloth(MC)的优化策略探讨(4)。一、MC的延时策略
在Unity Chan示例工程中,当我们导入MC包并调整MagicaPhysicsManager配置时,Update的设置至关重要。默认情况下,UpdatePerSeccond为帧/秒,UpdateMode设为Unscaled Time,这意味着无论游戏帧率如何变化,物理引擎都会执行。然而,这可能导致一帧内计算多次,影响性能。 将UpdateLocation设为After Late Update,意味着模拟会在Unity的LateUpdate后进行。在原有配置下,运行游戏并进行性能分析,切换到Delay Unscaled Time模式后,可以观察到主线程在JobHandle的Complete调用前不再阻塞,从而优化了计算顺序。二、MC的更新控制
MC巧妙地利用了延迟更新机制,通过MagicaPhysicsManager.cs中的代码,将模拟更新推迟到AfterRendering执行。即时更新时,会阻塞主线程;延时更新则在渲染后才完成模拟。这种设计确保了骨骼动画的正确同步,同时节省了等待时间。三、PlayerLoopSystem的深入理解
Unity的Update并不止于Start、Update等,PlayerLoopSystem提供了更细致的时序控制,允许开发者在引擎子系统之间插入自定义更新点。MC通过自定义PlayerLoopSystem,将更新时机插入到AfterRendering,实现了精细的Job调度。总结
通过源码解析,JobSystem和PlayerLoopSystem的结合使得MC的性能优化显著。虽然本人尚不足以深入理解其复杂设计,但对MC的创新设计深感佩服。DB系列研究至此告一段落,期待更多高手在此领域发挥创意。