新增禁用sab功能

This commit is contained in:
YHH
2025-09-28 20:41:23 +08:00
parent dedb91379f
commit de3bfd7551
9 changed files with 319 additions and 17 deletions

View File

@@ -11370,8 +11370,9 @@ class WorkerEntitySystem extends EntitySystem {
initializeSharedArrayBuffer() {
try {
if (!this.isSharedArrayBufferSupported()) {
console.warn(`[${this.systemName}] SharedArrayBuffer not supported, falling back to traditional Worker mode`);
console.warn(`[${this.systemName}] SharedArrayBuffer not supported, falling back to single Worker mode for collision detection integrity`);
this.config.useSharedArrayBuffer = false;
this.config.workerCount = 1;
return;
}
const bufferSize = this.config.maxEntities * this.config.entityDataSize * 4;
@@ -11379,10 +11380,11 @@ class WorkerEntitySystem extends EntitySystem {
this.sharedFloatArray = new Float32Array(this.sharedBuffer);
console.log(`[${this.systemName}] SharedArrayBuffer initialized successfully (${bufferSize} bytes)`);
} catch (error) {
console.warn(`[${this.systemName}] SharedArrayBuffer init failed, falling back to traditional Worker mode:`, error);
console.warn(`[${this.systemName}] SharedArrayBuffer init failed, falling back to single Worker mode for collision detection integrity:`, error);
this.config.useSharedArrayBuffer = false;
this.sharedBuffer = null;
this.sharedFloatArray = null;
this.config.workerCount = 1;
}
}
/**
@@ -11912,11 +11914,11 @@ let PhysicsWorkerSystem = class extends WorkerEntitySystem {
Matcher.empty().all(Position, Velocity, Physics),
{
enableWorker,
workerCount: navigator.hardwareConcurrency || 2,
// 恢复多Worker
// 当 SharedArrayBuffer 可用时使用多 Worker否则使用单 Worker 保证碰撞检测完整性
workerCount: this.isSharedArrayBufferAvailable() ? navigator.hardwareConcurrency || 2 : 1,
systemConfig: defaultConfig,
useSharedArrayBuffer: true
// 使用SharedArrayBuffer进行全局碰撞检测
// 优先使用 SharedArrayBuffer
}
);
this.physicsConfig = {
@@ -11928,6 +11930,12 @@ let PhysicsWorkerSystem = class extends WorkerEntitySystem {
};
this.startTime = 0;
}
/**
* 检查 SharedArrayBuffer 是否可用
*/
isSharedArrayBufferAvailable() {
return typeof SharedArrayBuffer !== "undefined" && self.crossOriginIsolated;
}
extractEntityData(entity) {
const position = entity.getComponent(Position);
const velocity = entity.getComponent(Velocity);
@@ -12050,6 +12058,45 @@ let PhysicsWorkerSystem = class extends WorkerEntitySystem {
getPhysicsConfig() {
return { ...this.physicsConfig };
}
/**
* 强制禁用 SharedArrayBuffer用于测试降级行为
*/
forceDisableSharedArrayBuffer() {
console.log(`[${this.systemName}] Manually disabling SharedArrayBuffer for testing`);
this.config.useSharedArrayBuffer = false;
this.config.workerCount = 1;
this.sharedBuffer = null;
this.sharedFloatArray = null;
if (this.workerPool) {
this.workerPool.destroy();
this.workerPool = null;
}
if (this.config.enableWorker) {
this.initializeWorkerPool();
}
}
/**
* 获取当前运行状态
*/
getCurrentStatus() {
const workerInfo = this.getWorkerInfo();
let mode = "sync";
if (workerInfo.enabled) {
if (workerInfo.sharedArrayBufferEnabled && workerInfo.sharedArrayBufferSupported) {
mode = "shared-buffer";
} else if (workerInfo.workerCount === 1) {
mode = "single-worker";
} else {
mode = "multi-worker";
}
}
return {
mode,
sharedArrayBufferEnabled: workerInfo.sharedArrayBufferEnabled,
workerCount: workerInfo.workerCount,
workerEnabled: workerInfo.enabled
};
}
/**
* 性能监控
*/
@@ -12470,6 +12517,18 @@ class GameScene extends Scene {
});
}
}
/**
* 切换 SharedArrayBuffer 状态
*/
toggleSharedArrayBuffer() {
this.physicsSystem.forceDisableSharedArrayBuffer();
}
/**
* 获取物理系统状态
*/
getPhysicsSystemStatus() {
return this.physicsSystem.getCurrentStatus();
}
/**
* 获取系统信息
*/
@@ -12533,6 +12592,7 @@ class WorkerDemo {
"entityCount",
"entityCountValue",
"toggleWorker",
"toggleSAB",
"gravity",
"gravityValue",
"friction",
@@ -12547,7 +12607,8 @@ class WorkerDemo {
"physicsTime",
"renderTime",
"frameTime",
"memoryUsage"
"memoryUsage",
"sabStatus"
];
for (const id of elementIds) {
const element = document.getElementById(id);
@@ -12576,6 +12637,12 @@ class WorkerDemo {
this.updateWorkerStatus();
});
}
if (this.elements.toggleSAB) {
this.elements.toggleSAB.addEventListener("click", () => {
this.gameScene.toggleSharedArrayBuffer();
this.updateWorkerStatus();
});
}
if (this.elements.gravity && this.elements.gravityValue) {
const slider = this.elements.gravity;
slider.addEventListener("input", () => {
@@ -12664,6 +12731,7 @@ class WorkerDemo {
const systemInfo = this.gameScene.getSystemInfo();
const workerInfo = systemInfo.physics;
const entityCount = systemInfo.entityCount;
const status = this.gameScene.getPhysicsSystemStatus();
if (this.elements.workerStatus) {
if (workerInfo.enabled) {
this.elements.workerStatus.textContent = `启用 (${workerInfo.workerCount} Workers)`;
@@ -12681,6 +12749,24 @@ class WorkerDemo {
this.elements.workerLoad.textContent = "N/A";
}
}
if (this.elements.sabStatus) {
const modeNames = {
"shared-buffer": "SharedArrayBuffer模式",
"single-worker": "单Worker模式",
"multi-worker": "多Worker模式",
"sync": "同步模式"
};
this.elements.sabStatus.textContent = modeNames[status.mode] || status.mode;
this.elements.sabStatus.className = status.mode === "shared-buffer" ? "worker-enabled" : "worker-disabled";
}
if (this.elements.toggleSAB) {
if (status.sharedArrayBufferEnabled) {
this.elements.toggleSAB.textContent = "禁用 SharedArrayBuffer";
} else {
this.elements.toggleSAB.textContent = "启用 SharedArrayBuffer";
this.elements.toggleSAB.setAttribute("disabled", "true");
}
}
}
getMemoryUsage() {
if ("memory" in performance) {

View File

@@ -118,7 +118,7 @@
color: #ff4a4a;
}
</style>
<script type="module" crossorigin src="/ecs-framework/demos/worker-system/assets/index-DRe9rMYY.js"></script>
<script type="module" crossorigin src="/ecs-framework/demos/worker-system/assets/index-DeXakP9I.js"></script>
</head>
<body>
<div class="container">
@@ -171,6 +171,17 @@
</div>
</div>
<script>
// Register Service Worker for SharedArrayBuffer support on GitHub Pages
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/ecs-framework/sw.js')
.then((registration) => {
console.log('Service Worker registered for SharedArrayBuffer support:', registration);
})
.catch((error) => {
console.log('Service Worker registration failed:', error);
});
}
</script>
</body>
</html>

39
docs/public/sw.js Normal file
View File

@@ -0,0 +1,39 @@
// Service Worker to add COOP/COEP headers for SharedArrayBuffer support
// This is a workaround for GitHub Pages which doesn't support custom headers
self.addEventListener('fetch', (event) => {
// Only handle requests for this origin
if (!event.request.url.startsWith(self.location.origin)) {
return;
}
event.respondWith(
fetch(event.request).then((response) => {
// Clone the response to modify headers
const newResponse = new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: {
...Object.fromEntries(response.headers.entries()),
'Cross-Origin-Embedder-Policy': 'require-corp',
'Cross-Origin-Opener-Policy': 'same-origin'
}
});
return newResponse;
}).catch((error) => {
console.error('Service Worker fetch failed:', error);
return fetch(event.request);
})
);
});
self.addEventListener('install', (event) => {
console.log('Service Worker: Installing for SharedArrayBuffer support');
self.skipWaiting();
});
self.addEventListener('activate', (event) => {
console.log('Service Worker: Activated for SharedArrayBuffer support');
event.waitUntil(self.clients.claim());
});