88 lines
2.8 KiB
TypeScript
88 lines
2.8 KiB
TypeScript
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实体,数据验证通过`);
|
||
});
|
||
}); |