Skip to content

Commit

Permalink
使用类型别名简化代码 | 缓存改进 | 使用模板字符串
Browse files Browse the repository at this point in the history
  • Loading branch information
esengine committed May 10, 2023
1 parent 6240ddd commit 0cfa357
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 21 deletions.
20 changes: 12 additions & 8 deletions source/bin/gs.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -327,9 +327,7 @@ declare module gs {
}
}
declare module gs {
type ComponentConstructor<T extends Component> = {
new (): T;
};
type ComponentConstructor<T extends Component> = new (...args: any[]) => T;
/**
* 组件管理器
*/
Expand Down Expand Up @@ -390,13 +388,13 @@ declare module gs {
private queryCache;
private tagCache;
systemManager?: SystemManager;
constructor(componentClasses?: Array<ComponentConstructor<any>>, systemManager?: SystemManager);
constructor(componentClasses?: Array<ComponentConstructor<Component>>, systemManager?: SystemManager);
setSystemManager(systemManager: SystemManager): void;
/**
* 添加组件管理器
* @param componentClass 要添加的组件类
*/
addComponentManager<T extends Component>(componentClass: new (...args: any[]) => T): void;
addComponentManager<T extends Component>(componentClass: ComponentConstructor<T>): void;
updateFrameNumber(): void;
getCurrentFrameNumber(): number;
getInputManager(): InputManager;
Expand All @@ -422,13 +420,13 @@ declare module gs {
* @param componentClass 要检查的组件类
* @returns 具有指定组件的实体数组
*/
getEntitiesWithComponent<T extends Component>(componentClass: new (...args: any[]) => T): Entity[];
getEntitiesWithComponent<T extends Component>(componentClass: ComponentConstructor<T>): Entity[];
/**
* 查找具有指定组件的实体
* @param componentClasses
* @returns
*/
getEntitiesWithComponents<T extends Component>(componentClasses: Array<new (...args: any[]) => T>): Entity[];
getEntitiesWithComponents<T extends Component>(componentClasses: ComponentConstructor<T>[]): Entity[];
/**
* 获取所有实体
* @returns
Expand All @@ -445,7 +443,7 @@ declare module gs {
* @param components 要查询的组件数组
* @returns 符合查询条件的实体数组
*/
queryComponents(components: (new (entityId: number) => Component)[]): Entity[];
queryComponents(components: ComponentConstructor<Component>[]): Entity[];
private performQuery;
/**
* 创建当前游戏状态的快照
Expand All @@ -468,6 +466,12 @@ declare module gs {
* @param factor
*/
applyInterpolation(factor: number): void;
/**
* 清除指定组件或标签的缓存
* @param componentClass
* @param tag
*/
invalidateCache(componentClass?: ComponentConstructor<Component>, tag?: string): void;
}
}
declare module gs {
Expand Down
20 changes: 19 additions & 1 deletion source/bin/gs.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ var gs;
if (this.entityManager.systemManager) {
this.entityManager.systemManager.notifyComponentAdded(this);
}
this.entityManager.invalidateCache(componentType);
return component;
};
/**
Expand Down Expand Up @@ -382,6 +383,7 @@ var gs;
this.componentBits.clear(componentIndex);
// 移除组件缓存
this.componentCache.delete(componentType);
this.entityManager.invalidateCache(componentType);
};
/**
* 是否有组件
Expand All @@ -404,6 +406,7 @@ var gs;
*/
Entity.prototype.addTag = function (tag) {
this.tags.add(tag);
this.entityManager.invalidateCache(undefined, tag);
};
/**
* 获取标签
Expand All @@ -418,6 +421,7 @@ var gs;
*/
Entity.prototype.removeTag = function (tag) {
this.tags.delete(tag);
this.entityManager.invalidateCache(undefined, tag);
};
/**
* 检查是否具有指定标签
Expand Down Expand Up @@ -1003,7 +1007,7 @@ var gs;
* @returns 符合查询条件的实体数组
*/
EntityManager.prototype.queryComponents = function (components) {
var key = components.map(function (c) { return c.name; }).sort().join('|');
var key = "" + components.map(function (c) { return c.name; }).sort().join('|');
if (!this.queryCache.has(key)) {
var result = this.performQuery(components);
this.queryCache.set(key, result);
Expand Down Expand Up @@ -1155,6 +1159,20 @@ var gs;
finally { if (e_14) throw e_14.error; }
}
};
/**
* 清除指定组件或标签的缓存
* @param componentClass
* @param tag
*/
EntityManager.prototype.invalidateCache = function (componentClass, tag) {
if (componentClass) {
var key = componentClass.name;
this.queryCache.delete(key);
}
if (tag) {
this.tagCache.delete(tag);
}
};
return EntityManager;
}());
gs.EntityManager = EntityManager;
Expand Down
2 changes: 1 addition & 1 deletion source/bin/gs.min.js

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions source/src/Core/Entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ module gs {
this.entityManager.systemManager.notifyComponentAdded(this);
}

this.entityManager.invalidateCache(componentType);

return component;
}

Expand Down Expand Up @@ -110,6 +112,7 @@ module gs {

// 移除组件缓存
this.componentCache.delete(componentType);
this.entityManager.invalidateCache(componentType);
}

/**
Expand All @@ -135,6 +138,7 @@ module gs {
*/
addTag(tag: string): void {
this.tags.add(tag);
this.entityManager.invalidateCache(undefined, tag);
}

/**
Expand All @@ -151,6 +155,7 @@ module gs {
*/
removeTag(tag: string): void {
this.tags.delete(tag);
this.entityManager.invalidateCache(undefined, tag);
}

/**
Expand Down
4 changes: 1 addition & 3 deletions source/src/Manager/ComponentManager.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
module gs {
export type ComponentConstructor<T extends Component> = {
new(): T;
};
export type ComponentConstructor<T extends Component> = new (...args: any[]) => T;

/**
* 组件管理器
Expand Down
32 changes: 24 additions & 8 deletions source/src/Manager/EntityManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module gs {
export class EntityManager {
private entities: Map<number, Entity>;
private entityIdAllocator: EntityIdAllocator;
private componentManagers: Map<ComponentConstructor<any>, ComponentManager<Component>>;
private componentManagers: Map<ComponentConstructor<Component>, ComponentManager<Component>>;
/** 当前帧编号属性 */
private currentFrameNumber: number;
private inputManager: InputManager;
Expand All @@ -12,7 +12,7 @@ module gs {
private tagCache: Map<string, Entity[]> = new Map();
public systemManager?: SystemManager;

constructor(componentClasses: Array<ComponentConstructor<any>> = null, systemManager?: SystemManager) {
constructor(componentClasses: Array<ComponentConstructor<Component>> = null, systemManager?: SystemManager) {
this.entities = new Map();
this.entityIdAllocator = new EntityIdAllocator();
this.inputManager = new InputManager(this);
Expand All @@ -36,7 +36,7 @@ module gs {
* 添加组件管理器
* @param componentClass 要添加的组件类
*/
public addComponentManager<T extends Component>(componentClass: new (...args: any[]) => T): void {
public addComponentManager<T extends Component>(componentClass: ComponentConstructor<T>): void {
const componentManager = new ComponentManager(componentClass);
this.componentManagers.set(componentClass, componentManager);
}
Expand Down Expand Up @@ -116,7 +116,7 @@ module gs {
* @param componentClass 要检查的组件类
* @returns 具有指定组件的实体数组
*/
public getEntitiesWithComponent<T extends Component>(componentClass: new (...args: any[]) => T): Entity[] {
public getEntitiesWithComponent<T extends Component>(componentClass: ComponentConstructor<T>): Entity[] {
return this.queryComponents([componentClass]);
}

Expand All @@ -125,7 +125,7 @@ module gs {
* @param componentClasses
* @returns
*/
public getEntitiesWithComponents<T extends Component>(componentClasses: Array<new (...args: any[]) => T>): Entity[] {
public getEntitiesWithComponents<T extends Component>(componentClasses: ComponentConstructor<T>[]): Entity[] {
return this.queryComponents(componentClasses);
}

Expand Down Expand Up @@ -164,16 +164,16 @@ module gs {
* @param components 要查询的组件数组
* @returns 符合查询条件的实体数组
*/
public queryComponents(components: (new (entityId: number) => Component)[]): Entity[] {
const key = components.map(c => c.name).sort().join('|');
public queryComponents(components: ComponentConstructor<Component>[]): Entity[] {
const key = `${components.map(c => c.name).sort().join('|')}`;
if (!this.queryCache.has(key)) {
const result = this.performQuery(components);
this.queryCache.set(key, result);
}
return this.queryCache.get(key);
}

private performQuery(components: (new (entityId: number) => Component)[]): Entity[] {
private performQuery(components: ComponentConstructor<Component>[]): Entity[] {
const result: Entity[] = [];

// 遍历所有实体
Expand Down Expand Up @@ -266,5 +266,21 @@ module gs {
}
}
}

/**
* 清除指定组件或标签的缓存
* @param componentClass
* @param tag
*/
public invalidateCache(componentClass?: ComponentConstructor<Component>, tag?: string): void {
if (componentClass) {
const key = componentClass.name;
this.queryCache.delete(key);
}

if (tag) {
this.tagCache.delete(tag);
}
}
}
}

0 comments on commit 0cfa357

Please sign in to comment.