今天发现到这个问题,不是BUG,而是一个比较容易疏忽的地方,特地写一下。
当我们需要在JobSystem下增删Entity/Component的时候,通常借助于创建一个Barrier(Unity ECS新版本下已改名为EntityComponentBufferSystem)的EntityCommandBuffer来进行后置操作。
而ECBSystem既然也是一个ComponentSystem,自然需要在执行序列中排在一个位置上。这里就是核心问题了,他的执行顺序并不一定在创建他的主System后面,甚至如果没有给他好好设置系统组(ComponentSystemGroup)的话,他会在你的主System前面。也就是说前一帧请求的增删得到下一帧才执行。
一般而言这没有什么问题。但是如果你的主系统要依赖后续其他系统在这之后进行处理的结果,那么延迟一帧就有可能带来逻辑上的错误了。
解决方法自然就是为ECBSystem也通过UpdateIn/After/Before标签设置好执行顺序,让他好好的呆在他的主System后面。
PS:要注意的是,尽管ECS系统完美的规避了系统之间的显性耦合,但是我这个例子体现了最为“邪恶”的耦合情形之一:两个系统都对同一个Compoent进行逻辑检查,从而构成了隐性耦合关系。虽然通过严格限制系统执行顺序解决了当前问题,但是还是应该从设计层面考虑如何消除这种耦合关系的。
最近刚刚开始看ECS相关的,还没有实际动手写过代码
但是感觉如果系统之间有顺序依赖,不是会影响多线程的执行吗,那么面向数据的优势不是就木有了。
还有请教dalao的英语是怎么学习的,如何才能做到随便听技术类演讲TAT
@aslan:理论上是这样,但是当然你不会让所有的系统之间都依赖成一团,而且也不是所有系统都随时需要运行。如果只有少量的2个,3个之间存在依赖其实不至于就影响性能了,而且可能也是很难完全避免,只能尽量减少吧。
最近由 zephyr1125 修改于:2019-03-09 22:20:57英语的话...真没什么特别的,我自己的经验就是尽量直接看原文文档和书籍吧,相信我技术类书籍的生词量很小的,很快就能适应。而且很多国内的翻译都很不靠谱,反而没有原文写的明白。