Entitas CookBook 翻译 - 102_Entity 实体

实体 Entity

一个Entity只是一个装满Component的容器。我们可以将Component添加到Entity中、从Entity中获取Component、也可以将一个Component从Entity上删除。在Entitas-CSharp中,有一种内部/通用的方式来执行这些操作:

entity.AddComponent(index, component);
entity.GetComponent(index);
entity.RemoveComponent(index);

我们必须使用索引,因为这个容器是以IComponent数组的形式实现的。在Entitas-CSharp中,我们选择使用数组是出于性能原因。然而,有些实现选择使用哈希表(HashMap),使Component类型成为Key,Component实例成为Value。

在你抱怨API太麻烦之前,让我向你展示如何在实际发开中添加、获取和删除Entitas-CSharp中的Component。

先假设我们有个Component PositionComponent

public sealed class PositionComponent : IComponent {
    public IntVector2 value;
}

那么实际上的API是这样的:

entity.AddPosition(new IntVector2(x, y));
entity.position;
entity.RemovePosition();

由于我们为Entitas-CSharp实现了一套代码生成工具(Code Generator),我们最终能直接使用这个漂亮的API。你可以在“器具(Appliances)”关于“代码生成(Code Generation)”一章中找到有关此主题的更多信息。

Entity的创建

Entity应始终是Context的一部分。这就是为什么我们不能直接实例化Entity,而必须调用context.CreateEntity()。Context是一个管理型的数据结构,用于监控Entity的生命周期,你可以在Context章节中找到关于Context的更多细节。

非常重要的一点,虽然可以创建和销毁Entity,Entitas-CSharp中销毁的Entity并未真正销毁,而是在Context中被缓存了起来(pooled in the context)。这是一个避免GC的性能优化。这个优化的副作用是:如果用户在自己的代码中保留对Entity的引用,那么这个引用的使用必须额外小心。

当一个Entity被销毁时,它将被放入一个临时池中,并在引用数量是'0'的时候被重用。

什么是引用数量?

引用数量是一种内部机制,它确保Entity在不再被引用之前不会被重用。Entity有两种方法处理引用:

public void Retain(object owner)

public void Release(object owner)

当你想保持对一个Entity的引用时,你必须调用entity.Retain(this);当你需要删除引用时,调用entity.Release(this);,这是非常重要的!这些调用会增加和减少引用计数。 Entitas-CSharp的所有内部类都遵守这种机制,所以你的代码也应该如此。如果您在保留对Entity的引用的同时不调用保留(Retain),则最终可能会引用一个已被销毁并重新生成的Entity。如果您忘记在保留的Entity上调用释放(Release),它将永远停留在对象池中,从而使您的内存消耗随着时间的推移而增长。

Entity的观察模式(entity observation)

一个Entity可以有多个用户订阅的事件,反映到Entity的生命周期上。
以下是Entitas-CSharp当前中所有事件的实现列表:

  • OnComponentAdded
  • OnComponentRemoved
  • OnComponentReplaced
  • OnEntityReleased
  • OnDestroyEntity

这些事件是Context 用于监视Entity 的相同事件。它们也暴露在外部使用,但我不建议直接使用它们。在典型的使用案例中,您更希望拥有一个Group,一个Collector 或一个Reactive System(这些都会在下面的章节中介绍)。

不管怎么样,知道这些设施的存在是很好的事情,如果您正在实现一些自己的工具,那么使用这些内置的设施可能就会变得很重要。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,926评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    麦兜兜买兜兜阅读 3,916评论 1 4
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    iOS_Alex阅读 5,496评论 1 24
  • ——再见戈多 神话的意义就在于,它浪漫地向我们展开这样一个令人难以反驳的事实:那便是在没有先行意识的情况下,我们被...
    kk横道世之介阅读 7,108评论 0 0

友情链接更多精彩内容