|
最近 DOTS 玩的比较多, 也来凑合几句. 首先针对高赞回答中的一些言论正一下试听:
DOTS 是不是专注解决性能问题?
是也不是, 准确来说, 能解决性能问题的技术是 JobSystem 和 Burst, ECS 只是专注于 Unity 应用长期以来缺乏的架构问题, 只不过 ECS 架构所特有的 Data-Orient 特性能更容易地解决 JobSystem 和 Burst 所需良好结构数据的问题.
能接近 Free Performance 的技术是 Burst, 唯一需要做的就是使用新的 Unity.Mathematics 来编写程序, 当然目前也有不少的限制(比如必须要blittable数据, 不支持 Class等), 同时也会有许多莫名其妙的 Bug (我甚至遇到过运行时内存数据被污染), 因此建议在开发阶段可以完全把 Burst 关掉.
Unity 目前在ECS上的动作是希望利用 ECS 的编译器将 JobSystem 也变为 Free Performance, 比如下面的代码就已经是 Jobify 过的代码, 不过用户可以几乎无感:- public class MySystem : SystemBase
- {
- protected override void OnUpdate()
- {
- Dependency = Entities
- .ForEach((Entity entity, int entityInQueryIndex, ref Data data) => {
- // my logic
- }).Schedule(Dependency);
- }
- }
复制代码 对比一下没有 Jobify 的写法:- public class MySystem : SystemBase
- {
- protected override void OnUpdate()
- {
- Entities
- .ForEach((Entity entity, int entityInQueryIndex, ref Data data) => {
- ...
- }).Run();
- }
- }
复制代码 与此同时, 使用 ECS 的另一个好处(或坏处)是, 你之前关于 Unity 专有的许多性能优化知识都没用了, 什么 Object Poolling, Instancing, Scene Streaming, Caching Components , GameObject.Find 等等都永远说再见了.
耦合度变高了,原本实习生或者策划能干的活全堆给程序员了?
恰恰相反, 因为面向数据设计的初衷就是为了解耦合, 你见过谁在设计数据库时出现"耦合度"问题吗?实际上 ECS 的编码过程就是设计数据的过程, 用好数据库的第一第二范式就能设计出相对良好的程序结构, ECS world 里的数据也可以完全和副作用说拜拜.
至于策划? 可以看看我翻译的基于 Game Object Conversion 和 SubScene 的 DOTS 开发工作流 你就能明白为何结论也是恰恰相反: DOTS 让两者的角色更加清晰分离, 策划你就别插手代码了. 什么? 你还是想改? Visual Scripting 了解一下.
TinyMode为啥和ECS绑定?
很简单, 因为 H5 运行的环境恰恰是性能低下的 Mobile 平台, 性能这东西就像钱, 钱多就能买多点, 钱少买的少点, 并不是说我需要渲染上百万个对象才需要性能, 而是到处都需要性能, 这也是为啥 Unity 的口号是 Performance By Default. 而不是 Performance By 高工资程序员.
C# 不如 C++ 高效?
毫无必要的争论, 说这话的人知道 unsafe 关键字吗? 事实上, 不是 Unity 不在业务层面用Cpp, 而是 Unity 压根就不想用C++, 因此把整个引擎都逐渐转向 C# 了, 原有 C++ 的 Runtime Core 会越来越小, 新出的 Package 都是 C# based 的, 为啥? 因为 C# 开发体验好, Burst 和 JobSystem 又可以直接榨干 CPU , 两全其美.
DOTS学起来太难了!
不不不, 一点都不难, 之所以你觉得难, 是因为你没有转变过来 Data-Orient Design 的思想, 满脑子都还是继承一个 Person 类得到 Woman类, 这完全是两种处理问题的思路, 脑子转不过弯来当然觉得难了.
既然 DOTS 这么牛逼, 为啥还没普及?
很简单, DOTS 现阶段在完成度上就是接近废品的残次品, 我在这里说到过现阶段的DOTS, 粘过来给你们看看.
非常遗憾, 经过了 Unity 长达近三年的宣传, DOTS到今天完成度依然极低, 基本上处于不可用的状态, 一款游戏引擎必不可少的部分可简单列为下面八个, 接下来我分开说说在 DOTS 技术栈里他们的现状
Physics - 3分 物理自然是大部分游戏都不可或缺的部分, DOTS配套的 Unity Physics 依然处于非常早期的状态, Authoring 工具几乎为零, 甚至 Joint 或者 CharacterConroller 都要从 Sample 里找代码自己挨个儿实现, 由于它提供了一套船新的 API, 开发的过程只能用极难使用来形容, 来看看Trigger 事件的代码就知道了, 而在使用过程中也是Bug层出, 经常会遇到类似 Mesh Collider Bake错误, 而与之同期宣传的 Havok Physics for Unity 更是奇妙, 在长达半年的时间里, 只是单纯引入 Havok 的便会导致 HDRP 的渲染出问题. 而更进阶的布料, 粒子, 地形等也处于几乎为零的状态.Graphics - 3分 DOTS与之配套的是图形系统是 HybridRenderer, 不过目前也只支持 Mesh Renderer, 什么 Particle 啦, Trail 啦, VFX都还没影儿, 更可惜的是官方现在优先关注于 HDRP 的兼容性(虽然也不怎么样), URP或者Built-In Pipeline就基本别想了, 遇到了问题也只能双手一摊.Audio - 0分 Unity目前只开发了底层的 DSP 系统, 上层的 DOTS audio 说了一两年了连影子都没有, 完成度接近于零.Animation - 0分 Unity Animation 依然处于极早期的开发中, DOTS Sample 展示了一些最最基本的使用, 类似 Animator 这样的高层方案现在还没影儿.Network - 2分 也是 Unity 吹了两年的东西, DOTS Sample 中用的 NetCode 只不过把 FPSSample 中的部分代码挪过去了, 目前版本号 0.0.4, 意思就是太早期了别用.UI - 0分 IMGUI, UI Element 和 Unity UI 三个Unity的产品均不支持 DOTSAI - 0分 navmesh, ml-agent, ai planner 三个Unity的产品均不支持 DOTSInput - 2分 老的 Input System 相对简单与DOTS没啥关系, 可新的 Input System 居然也不支持 DOTS, 幸运的是 InputSystem 相对独立, 嫁接进DOTS并不困难.
所以, 要怪就怪 Unity 的营销部门, 吹太过了, 步子太大扯到了蛋, 整个社区里弥漫着这样的气氛:
DOTS Sample 不是看起来挺好的啊
是的, 看起来是挺好的, 总的来讲 DOTS 肯定是未来, 现在是算是学习 DOTS 的不错时间, 最近正在写一个关于 DOTS Sample 的系列文章, 我会尽我所能将 DOTS Sample 所折射的 DOTS 的现阶段的优缺点和开发过程都理出来, 有兴趣的同学可以关注一下.
林七千:深入了解 Unity DOTS Sample (序章) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|