游戏引擎中ECS架构及内存布局

server/2024/10/25 13:39:37/

一.ECS

     E:Entity-游戏世界中的人,房子等实际物体,这些物体可能由不同的MetaMesh,ParticleSys组成

     C:Component-组成实际物体的MetaMesh,ParticleSys,也可以是一个实际物体

     S:System-游戏引擎,负责完成实际物体的初始化,内存管理,帧同步,线程同步等核心功能

二.ECS内存布局

     1.创建GameSystem,维护Entities列表

public class GameSystem
{public List<GameEntity> entities = new List<GameEntity>;
}

     2.创建GameSystem引擎回调接口,帧渲染回调,实例创建回调,物理检测回调等

public abstract class GameSystemCallback
{public virtual void OnEntityInit();public virtual void OnGameSystemTick();public virtual void OnEntityDeInit();
}int main()
{while(true){for(GameEntity entity: entities){#FPS游戏帧同步回调GameEntityComponent scriptComponent = entity.getScript()scriptComponent.OnGameSystemTick();}}
}

     3.创建实际的Entity,可能是一个人

public class Agent: GameEntity
{public int age;public int health;public int height;
}

     4.创建对应Entity下的Component,人具备技能,人具备盔甲,人具备AI三种不同的Component

public SkillComponent : GameEntityComponent
{public override void OnFrameTick(){//释放技能按键,业务逻辑}
}public AIComponent : GameEntityComponent
{public override void OnFrameTick(){//人物AI行为}
}public ArmorComponent : GameEntityComponent
{public override void OnFrameTick(){//人物盔甲挂载和卸下}
}

     5.将三种不同的Component添加至Entity中,检测人是否具备了技能,盔甲等特性

Agent agent = new GameEntity();
agent.addComponent(skillComponent);
agent.addComponent(armorComponent);
agent.addComponent(aiComponent);


http://www.ppmy.cn/server/134727.html

相关文章

【企业老总必读】如何监控员工上网行为?监控员工上网的4种方法!人手一个!

想象一下&#xff0c;企业就像一艘大船&#xff0c;每位员工就是水手。但在这片网络海洋中&#xff0c;如何确保每位水手都专注于航行方向&#xff0c;而非偏离航道呢&#xff1f; 答案就是——监控员工上网行为。 今天&#xff0c;我们就来聊聊如何为每位“水手”配备一个“导…

Word、PDF转换为图片Java

Word、PDF转换为图片Java 需求要在小程序端展示文档内容&#xff0c;所以将文档每页转换为图片后显示 参考和其他等方案&#xff1a; https://blog.csdn.net/strggle_bin/article/details/140599514 https://www.modb.pro/db/566986 https://blog.csdn.net/spring_is_comin…

【小白学机器学习16】 概率论的世界观2: 从正态分布去认识世界

目录 1 从正态分布说起 1.1 正态分布的定义 1.2 正态分布的名字 1.3 正态分布的广泛&#xff0c;和基础性 2 正态分布的公式和图形 2.1 正态分布 2.2 标准正态分布 3 正态分布的认识的3个层次 3.1 第1层次&#xff1a;个体的某个属性的样本值&#xff0c;服从正态分布…

django celery 定时任务 Crontab 计划格式

Celery 定时任务教程 Celery 是一个强大的异步任务队列/作业队列基于分布式消息传递的开源项目。它广泛用于处理各种类型的后台任务&#xff0c;例如发送电子邮件、处理图像、数据分析和视频转换等。 本文将介绍如何使用 Celery 实现定时任务&#xff0c;包括&#xff1a; 安…

Web前端高级工程师培训:使用 Node.js 构建一个 Web 服务端程序(1)

1-使用 Node.js 构建一个 Web 服务端程序 文章目录 1-使用 Node.js 构建一个 Web 服务端程序1、Node.js的安装与基础语法2、Node.js 中的 JavaScript 与 浏览器中的 JavaScript2-1、Node.js 中的 JavaScript2-2、浏览器 中的 JavaScript 3、什么是 WebServer(APP)&#xff1f;4…

【MySQL】提高篇—索引与性能优化:索引的概念与类型(单列索引、复合索引、全文索引)

在关系数据库中&#xff0c;当表中的数据量增大时&#xff0c;查询性能可能会显著下降。为了提高数据检索的效率&#xff0c;数据库系统提供了索引的概念。 索引类似于书籍的目录&#xff0c;可以快速定位到特定的数据行&#xff0c;从而加快查询速度。 索引的使用在实际应用…

开源数据库学习 - MYSQL - 开篇路线

最近对于数据库的知识有了点兴趣&#xff0c;公司里面由于项目大多是to B的项目所以基本采用oracle、db2、sqlserver这些有大企业支持的数据库&#xff0c;基本上遇见了问题都是有专门的技术服务公司提供技术支持&#xff08;要花钱&#xff09;。但是最近今年&#xff0c;随着…

vue3中ref和reactive的用法,区别和优缺点,以及使用场景

写在前头&#xff1a; reactive定义的数据只能修改里面的属性&#xff0c;不能将整个数据替换&#xff0c;实在要替换请使用 Object.assign(obj1, obj2);举个例子 这种写法无法直接改变obj1 let obj1 reactive({name: 猫,age: 2, });obj1 {name: 猪,age: 2, } 正确的写法…