当前位置: 首页 > news >正文

小企业网站建设服务在discuz做网站

小企业网站建设服务,在discuz做网站,2022年最新新闻播报稿件,为网站做推广ECS由浅入深第一节 ECS由浅入深第二节 ECS由浅入深第三节 ECS由浅入深第四节 ECS由浅入深第五节 尽管 ECS 带来了显著的性能和架构优势#xff0c;但在实际的 Unity 项目中#xff0c;完全摒弃 GameObject 和 MonoBehaviour 往往是不现实的。Unity 引擎本身的大部分功能…ECS由浅入深第一节 ECS由浅入深第二节 ECS由浅入深第三节 ECS由浅入深第四节 ECS由浅入深第五节 尽管 ECS 带来了显著的性能和架构优势但在实际的 Unity 项目中完全摒弃 GameObject 和 MonoBehaviour 往往是不现实的。Unity 引擎本身的大部分功能如 UI、动画系统、粒子系统、物理引擎非 DOTS 物理、光照烘焙、场景管理乃至编辑器扩展都深度依赖于 GameObject。 因此一种混合架构Hybrid Architecture成为了在 Unity 中应用 ECS 的常见且高效的策略。这意味着我们将 ECS 作为核心的逻辑层处理大量实体的计算和数据管理而 GameObject 则作为表现层或桥接层负责渲染、动画播放、与 Unity 现有系统的交互以及那些不适合纯 ECS 处理的特定任务。 何时需要混合模式 混合模式并非妥协而是一种策略性的选择。以下情况通常会促使你考虑采用混合架构 UI 系统 Unity 的 UGUI 或 UI Toolkit 都是基于 GameObject 和 MonoBehaviour 构建的。将 ECS 数据直接映射到 UI 上通常比用 ECS 重建 UI 系统更高效。复杂动画 Mecanim 动画系统功能强大且成熟处理角色动画、动画融合等非常方便。如果完全用 ECS 实现一套动画系统成本极高。粒子系统 Unity 的粒子系统也是 GameObject 组件。对于大量复杂的粒子效果直接使用原生粒子系统更优。第三方插件集成 大多数 Unity 插件都是为 GameObject 设计的。混合模式可以让你继续利用这些宝贵的资源。物理引擎 如果你使用的是 Unity 内置的 Rigidbody 和 Collider而不是 Unity DOTS 的 Unity Physics那么你的物理模拟仍然依赖 GameObject。美术工作流 美术师通常习惯在 Unity 编辑器中拖拽 GameObject、调整组件属性来搭建场景和角色。纯 ECS 可能会打断他们的工作流。迭代速度 对于某些原型开发或快速迭代的模块传统模式可能更快。 数据同步与转换逻辑层与表现层的桥梁 混合架构的核心挑战在于如何高效地在 ECS 逻辑层和 GameObject 表现层之间同步数据。这通常涉及到“读”和“写”两个方向 1. 将 ECS 数据反映到 GameObject (ECS - GameObject) 这是最常见的同步方向即让 ECS 的计算结果驱动 GameObject 的表现。 实现方式 MonoBehaviour 作为数据观察者 在你的 GameObject 上挂载一个 MonoBehaviour 脚本它持有其对应 ECS Entity 的 ID。在 Update 方法中该 MonoBehaviour 可以从 EntityManager 中查询并读取其 Entity 的 Component 数据例如 Position、Rotation 等然后更新 GameObject 的 Transform 或其他组件。 // 假设这是挂载在 GameObject 上的 MonoBehaviour public class EntityView : MonoBehaviour {public Entity entityId; // 对应 ECS 中的 Entity ID// 在 Awake 或 Start 中初始化 entityId// 例如当一个 ECS Entity 被创建时也创建一个 GameObject 并绑定这个 Viewvoid LateUpdate() // 通常在所有 ECS System 运行之后更新表现{if (entityId.Id 0) return; // 确保 Entity 已设置// 获取 ECS 的 EntityManager 实例 (需要全局可访问或通过引用传递)EntityManager entityManager GetMyEntityManagerInstance(); // 伪代码实际需要一个获取方式// 获取 Entity 的位置和旋转组件Position pos entityManager.GetComponentPosition(entityId);Rotation rot entityManager.GetComponentRotation(entityId); // 假设有 Rotation Component// 将 ECS 的数据同步到 GameObject 的 Transformtransform.position new Vector3(pos.X, pos.Y, 0); // 假设是2D// transform.rotation Quaternion.Euler(0, 0, rot.Z); // 假设是2D旋转}// 当对应的 ECS Entity 被销毁时销毁 GameObjectpublic void OnEntityDestroyed(){Destroy(gameObject);} }// 在某个 System 中创建 GameObject 并绑定 EntityView public class EntitySpawnSystem : ISystem {public GameObject prefab; // 从编辑器中拖拽过来的 Prefabpublic void OnCreate(EntityManager em) { }public void OnDestroy(EntityManager em) { }public void OnUpdate(EntityManager em){// 假设我们有一个 Component 标记需要生成 View// (这里只是一个简单演示实际创建流程可能更复杂)// 每次 Update 都会执行所以需要确保只创建一次或有条件触发// 例如可以有一个 IsInitializedComponent 来避免重复创建if (em.GetComponentTestComponent(new Entity { Id 0 }).isSpawned) return; // 伪代码Entity playerEntity em.CreateEntity();em.AddComponent(playerEntity, new Position { X 0, Y 0 });em.AddComponent(playerEntity, new Velocity { VX 0.1f, VY 0.05f });// 创建对应的 GameObject 实例GameObject go GameObject.Instantiate(prefab);EntityView view go.GetComponentEntityView();if (view ! null){view.entityId playerEntity; // 绑定 ECS Entity ID}Console.WriteLine($Spawned GameObject for Entity {playerEntity});em.AddComponent(new Entity { Id 0 }, new TestComponent { isSpawned true }); // 标记已创建防止重复} }集中式同步系统 可以有一个专门的 MonoBehaviour (例如 ECSBridgeManager)它在 Update 或 LateUpdate 中遍历所有需要同步的 ECS Entity然后更新它们对应的 GameObject。这种方式可以更集中地管理同步逻辑。 2. 将 GameObject 数据发送到 ECS (GameObject - ECS) 这主要用于用户输入、碰撞检测、UI 交互等需要从 Unity 现有系统获取数据并反馈给 ECS 逻辑的场景。 实现方式 MonoBehaviour 作为数据生产者 MonoBehaviour 接收来自 Unity 的事件如 OnTriggerEnter、OnMouseDown然后将这些信息转换为 ECS 中的事件 Component 或直接修改 ECS 中的数据。 // 挂载在可被点击的 GameObject 上的 MonoBehaviour public class ClickableEntityProxy : MonoBehaviour {public Entity entityId; // 对应的 ECS Entity IDvoid OnMouseDown() // Unity 的鼠标点击事件{if (entityId.Id 0) return;// 获取 ECS 的 EntityManager 实例EntityManager entityManager GetMyEntityManagerInstance();// 给对应的 ECS Entity 添加一个“点击事件”Component// 这是一个一次性事件 ComponententityManager.AddComponent(entityId, new ClickEvent { ClickerEntity new Entity { Id 999 } }); // 假设 999 是玩家 Entity IDConsole.WriteLine($GameObject clicked, sending ClickEvent to Entity {entityId});} }// 在 ECS 中有一个 System 来处理 ClickEvent public class ClickReactionSystem : ISystem {public void OnCreate(EntityManager em) { }public void OnDestroy(EntityManager em) { }public void OnUpdate(EntityManager em){Console.WriteLine(--- Running ClickReactionSystem ---);foreach (var (entity, clickEvent) in em.ForEachClickEvent()){Console.WriteLine($ Entity {entity} received click from {clickEvent.ClickerEntity}.);// 可以在这里改变 Entity 的状态例如让它播放动画、触发效果等// 例如em.AddComponent(entity, new PlayAnimationComponent { AnimationName Clicked });em.RemoveComponentClickEvent(entity); // 处理完后移除事件}} }物理碰撞处理 碰撞代理 Component 在 MonoBehaviour 的 OnTriggerEnter/OnCollisionEnter 中获取碰撞到的 GameObject 的 EntityView如果它也有对应的 Entity然后为两个 Entity 创建一个 CollisionEventComponent包含碰撞信息如碰撞到的 Entity ID、接触点等。ECS 物理系统 如果你使用的是 Unity DOTS 的物理系统那么碰撞直接在 ECS 内部处理不需要这种代理。 “渲染层”与“逻辑层”分离的思考 在混合架构中最理想的状态是实现逻辑层和表现层的完全解耦。 逻辑层ECS 包含所有游戏规则、状态、AI、模拟等核心逻辑。它应该完全独立于 Unity GameObject 细节甚至理论上可以脱离 Unity 引擎运行例如用于服务器。表现层GameObject 负责所有视觉、听觉效果和用户输入。它从逻辑层获取数据并进行渲染同时将输入事件传递给逻辑层。 设计接口 可以在逻辑层和表现层之间设计明确的接口或数据协议。例如逻辑层生成一系列渲染指令或动画播放请求作为 Component表现层 System 订阅这些 Component 并驱动 GameObject 播放动画或渲染。 性能考量与优化策略 混合架构虽然灵活但也引入了额外的性能开销 数据转换开销 从 ECS 的数据结构转换到 Vector3、Quaternion 等 Unity 常用类型或反之会产生一定的 CPU 开销。对于每帧更新的大量数据这可能会成为瓶颈。同步点 ECS 的核心优势在于并行化但 GameObject 的 Transform 等操作通常在主线程进行。这意味着在数据同步时System 可能需要等待主线程完成操作形成同步点 (Sync Point)从而限制了并行度。GC 压力 MonoBehaviour 和 GameObject 可能会产生垃圾回收。尽可能减少在 Update 中创建新的对象使用对象池等技术。 优化策略 只同步必要数据 避免同步所有 Component。只同步那些真正影响 GameObject 表现或需要 GameObject 输入的 Component。批量同步 尽量一次性同步一批 Entity 的数据而不是逐个 Entity 同步。例如一个 MonoBehaviour System 遍历所有 EntityView然后一次性读取 EntityManager 的数据。延迟同步 (LateUpdate) 将 ECS - GameObject 的同步放在 LateUpdate 中执行确保所有 ECS System 都在该帧完成逻辑计算。按需同步 仅当数据发生变化时才进行同步而不是每帧都同步。这可能需要额外的 DirtyComponent 或事件机制来标记变化。避免在 Job 中直接操作 GameObject 任何对 GameObject 或 MonoBehaviour 的操作都必须在主线程进行。如果需要在 Job 中处理数据并最终影响 GameObjectJob 应该将结果写入 NativeContainer然后在主线程的 System 或 MonoBehaviour 中读取 NativeContainer 并更新 GameObject。 示例场景角色动画与 ECS 移动 ECS 负责 角色位置、速度、状态奔跑、攻击、受伤等的计算。GameObject 负责 角色模型的渲染、Mecanim 动画的播放。 ECS 逻辑 PlayerInputSystem接收键盘输入生成 MovementInputComponent。MovementSystem根据 MovementInputComponent 更新 Position 和 Velocity并根据速度判断是否处于“奔跑”状态更新 IsRunningComponent。AttackSystem检测攻击输入添加 AttackEventComponent并在攻击命中时添加 DamageEventComponent。 GameObject 表现 CharacterAnimatorController (MonoBehaviour)挂载在角色 GameObject 上持有对应 Entity 的 ID。在 LateUpdate 中CharacterAnimatorController 读取其 Entity 的 IsRunningComponent并设置 Animator 的 IsRunning 参数。当 AttackEventComponent 或 DamageEventComponent 出现时CharacterAnimatorController 可能会订阅一个事件或者通过一个 PlayAnimationCommandComponent然后调用 Animator 的 Play() 方法。TransformSync (MonoBehaviour)读取 Position 和 Rotation Component 来更新 GameObject 的 Transform。 通过这种方式高性能的逻辑计算发生在 ECS 中而 Unity 强大的表现层能力得到了充分利用实现了两者的最佳结合。 小结 混合架构是 Unity 中实现 ECS 的现实选择。它允许你充分利用 ECS 在性能和架构上的优势同时又不会放弃 Unity 现有生态系统和便捷的开发工具。关键在于理解数据在 ECS 逻辑层和 GameObject 表现层之间的流动方式并选择合适的同步策略和优化手段。 通过精心设计你可以构建一个既高效又易于维护的 Unity 游戏项目。现在你已经掌握了 ECS 的核心理论、简化框架的搭建、复杂行为的实现以及如何将其融入 Unity 的现有体系。 在下一篇文章中我们将总结 ECS 开发中的调试技巧、常见的性能瓶颈及解决方案并对 ECS 的未来发展进行一些展望帮助你更好地驾驭这一强大的技术。敬请期待 ECS由浅入深第一节 ECS由浅入深第二节 ECS由浅入深第三节 ECS由浅入深第四节
http://www.zqtcl.cn/news/678088/

相关文章:

  • 电商需要多少投入沈阳网站关键词优化
  • 速拓科技是做网站百度推广登陆入口官网
  • 十大高端网站设计网站开发培训达内
  • 河北云网站建设怎么让别人找你做网站
  • 怎么自己在电脑上做网站网络服务有哪些与对生活的影响
  • asp网站采集和平东路网站建设
  • 深圳市 交易建设中心网站越南的网站建设
  • 微网站建设方式构建网站系统
  • 优秀网站的要素有公司名字寓意好的字
  • 学习型网站空间网站模板免费下载酒店管理系统
  • icp备案网站用不了备案期间关闭网站
  • 上海电子门户网站建设数据公司签约网站
  • 北京品牌高端网站建设公司天津最好的网站建设公司
  • 网站开发中文摘要当今做啥网站致富
  • 钓鱼网站制作方法WordPress音乐免刷新
  • 北京网站建设的公网站订票策划方案
  • 做搜狗网站快速排名福田瑞沃自卸车
  • 帮人做图挣外快的网站做网站刷流量挣钱吗
  • 网站改版被降权从0到建网站
  • dedese网站牛客网官网
  • 网站到期续费要多少钱如何做一个电商
  • 试述网站建设的步骤石家庄公司网站如何制作
  • 百度推广自己做网站吗韶关东莞网站建设
  • 濮阳建站建设室内设计效果图图片
  • 上海找做网站公司国外网站国内做好还是国外做
  • 一个vps建两个网站怎么弄数据库济南地产行业网站开发
  • 网站到期请续费站长网
  • 个人网站名字可以用哪些促销网站怎么做
  • 网站开发需要提供哪些东西镇江网络违法网站
  • 都江堰建设局官方网站wordpress分享此文章