G-Framework 是一个基于 TypeScript 编写的实体组件系统(ECS)框架,旨在为游戏开发者提供一个高性能、易用、可扩展的游戏逻辑框架。G-Framework 可以与多种游戏引擎无缝集成,支持逻辑并发执行,让你的游戏开发变得更加高效。
-
高性能:G-Framework 专为游戏开发场景优化,具备高性能数据处理能力,有效降低游戏性能损耗。
-
纯逻辑实现:无需依赖其他框架,G-Framework 让您专注于游戏逻辑,减少额外学习成本。
-
易用性:简洁的 API 和明确的组件和系统隔离设计,降低上手难度,提高开发效率。
-
跨平台支持:无论您使用哪种游戏引擎,G-Framework 都可以轻松集成,提供一致的开发体验。
-
可扩展性:通过模块化设计,方便开发者自由添加自定义模块,快速满足项目需求。
-
实时并发执行支持:G-Framework 支持逻辑并发执行,确保游戏中各个模块的实时响应。
-
详细的文档支持:我们提供了详细的文档和教程,助您更快地了解和上手 G-Framework。
点击链接加入群聊【ecs游戏框架交流】:https://jq.qq.com/?_wv=1027&k=29w1Nud6
G-Framework 不仅提供了优秀的实体组件系统(ECS)核心,还结合多种专门针对帧同步优化策略和快速上手的实用模块,让您的游戏开发过程更加高效和轻松。以下是 G-Framework 提供的一些模块,助您在游戏开发中快速实现所需功能:
- 事件总线 用于在系统之间传递事件的模块,方便在不同系统间解耦地通信
- 时间管理器 管理游戏中的计时器和帧率,确保各种定时任务的精确执行
- 状态机 实现有限状态机的逻辑,帮助您管理游戏角色和对象的状态切换
- 输入适配器 根据您使用的游戏引擎,为您提供便捷的输入事件抽象,简化输入控制
- 网络适配器 提供网络通信的抽象接口,可以与各种网络库无缝对接
- 状态快照 用于记录和操作游戏状态的快照,方便在帧同步中处理状态变更
- 客户端插值 提供插值算法,优化客户端帧同步下的状态表现,如平滑移动效果
- 输入管理器 管理游戏输入,如键盘、鼠标和触摸事件,并在合适的时机同步输入状态
- 游戏同步策略 针对游戏同步提供了多种策略,如状态插值、状态压缩等,按需选择使用。
- 对象池 提供了一种高效的对象管理方式,通过重用对象来避免频繁的对象创建和销毁,可以用于管理游戏中的实体,如子弹、角色等。
- 实体预制件 提供了对预制体的管理功能,包括注册、注销以及从预制体创建新实体等功能。它是一个事先配置好的实体模板,我们可以从中快速复制(实例化)出新的实体
G-Framework 通过提供这些实用模块,让您在游戏开发过程中专注于逻辑实现,更快速地满足项目需求。这些模块针对帧同步做了大量优化,确保您的项目在采用帧同步时获得较佳的性能表现。
核心是该框架的重要目标,它包含了实体、组件、系统的管理。
const core = gs.Core.instance;
实体是游戏中的基本对象,每个实体由一个唯一的 ID 标识,并包含一组组件。你可以通过 G-Framework 的 Entity 类来创建和管理实体。
// 创建实体
const entity = this.core.entityManager.createEntity();
使用createEntity你可以轻松的创建自定义实体
class Player extends gs.Entity {
onCreate(): void {
console.log('player 实体创建');
}
onDestroy(): void {
console.log('player 实体销毁');
}
}
const playerEntity = entityManager.createEntity(Player);
onCreate方法和onDestroy方法由框架调用,分别再实体的创建和销毁时触发
组件是实体的数据属性,用于描述实体的状态和行为。每个组件都是一个类,继承自 G-Framework 的 Component 类。
// 创建组件
class PositionComponent extends gs.Component {
public x: number = 0;
public y: number = 0;
public reset() {
this.x = 0;
this.y = 0;
}
}
class VelocityComponent extends gs.Component {
public x: number = 0;
public y: number = 0;
public reset() {
this.x = 0;
this.y = 0;
}
}
注意,需要实现reset方法,当组件回收时会调用该方法
现在,你可以将组件附加到实体上:
// 为实体添加组件
entity.addComponent(PositionComponent);
entity.addComponent(VelocityComponent);
系统是用于处理实体和组件的逻辑的核心部分,通过继承 G-Framework 的 System 类创建系统。
// 创建系统
class MoveSystem extends gs.System {
entityFilter(entity: gs.Entity): boolean {
return entity.hasComponent(PositionComponent) && entity.hasComponent(VelocityComponent);
}
update(entities: gs.Entity[]): void {
const deltaTime = gs.TimeManager.getInstance().deltaTime;
for (const entity of entities) {
const position = entity.getComponent(PositionComponent);
const velocity = entity.getComponent(VelocityComponent);
position.x += velocity.x * deltaTime;
position.y += velocity.y * deltaTime;
}
}
}
// 注册系统到系统管理器中
const moveSystem = new MoveSystem(this.core.entityManager, 0);
this.core.systemManager.registerSystem(moveSystem);
在每个游戏循环中,你可以调用 核心中的 的 update() 方法来更新所有系统:
function gameLoop(deltaTime: number) {
this.core.update(deltaTime);
}
测试项 | 耗时 |
---|---|
创建 1000 个实体并分配组件 | 0.80 ms |
更新 1000 次系统 | 0.40 ms |
创建并删除 1000 个实体 | 0.80 ms |
筛选 5000 个实体中具有位置和速度组件的实体 | 0.00 ms |
添加和删除 1000 个实体的组件 | 1.40 ms |