新增soastorage存储器

This commit is contained in:
YHH
2025-07-30 14:14:04 +08:00
parent 0411aa9aef
commit 01fa33e122
14 changed files with 2632 additions and 5 deletions

View File

@@ -0,0 +1,88 @@
import { Component } from '../../../src/ECS/Component';
import { ComponentStorageManager, EnableSoA } from '../../../src/ECS/Core/ComponentStorage';
// 默认原始存储组件
class PositionComponent extends Component {
public x: number = 0;
public y: number = 0;
public z: number = 0;
}
// 启用SoA优化的组件用于大规模批量操作
@EnableSoA
class LargeScaleComponent extends Component {
public x: number = 0;
public y: number = 0;
public z: number = 0;
public vx: number = 0;
public vy: number = 0;
public vz: number = 0;
}
describe('SoA优化选择测试', () => {
let manager: ComponentStorageManager;
beforeEach(() => {
manager = new ComponentStorageManager();
});
test('默认使用原始存储', () => {
const storage = manager.getStorage(PositionComponent);
// 添加组件
manager.addComponent(1, new PositionComponent());
// 验证能正常工作
const component = manager.getComponent(1, PositionComponent);
expect(component).toBeTruthy();
expect(component?.x).toBe(0);
// 验证使用原始存储
expect(storage.constructor.name).toBe('ComponentStorage');
});
test('@EnableSoA装饰器启用优化', () => {
const storage = manager.getStorage(LargeScaleComponent);
// 添加组件
const component = new LargeScaleComponent();
component.x = 100;
component.vx = 10;
manager.addComponent(1, component);
// 验证能正常工作
const retrieved = manager.getComponent(1, LargeScaleComponent);
expect(retrieved).toBeTruthy();
expect(retrieved?.x).toBe(100);
expect(retrieved?.vx).toBe(10);
// 验证使用SoA存储
expect(storage.constructor.name).toBe('SoAStorage');
});
test('SoA存储功能验证', () => {
const entityCount = 1000;
// 创建实体使用SoA优化
for (let i = 0; i < entityCount; i++) {
const component = new LargeScaleComponent();
component.x = i;
component.y = i * 2;
component.vx = 1;
component.vy = 2;
manager.addComponent(i, component);
}
// 验证数据正确性
const testComponent = manager.getComponent(100, LargeScaleComponent);
expect(testComponent?.x).toBe(100);
expect(testComponent?.y).toBe(200);
expect(testComponent?.vx).toBe(1);
expect(testComponent?.vy).toBe(2);
// 验证存储类型
const storage = manager.getStorage(LargeScaleComponent);
expect(storage.constructor.name).toBe('SoAStorage');
console.log(`成功创建 ${entityCount} 个SoA实体数据验证通过`);
});
});