diff --git a/packages/core/src/ECS/Scene.ts b/packages/core/src/ECS/Scene.ts index 40865517..2f2a8efc 100644 --- a/packages/core/src/ECS/Scene.ts +++ b/packages/core/src/ECS/Scene.ts @@ -639,9 +639,13 @@ export class Scene implements IScene { incremental: IncrementalSnapshot | string | Buffer, componentRegistry?: Map ): void { - const snapshot = (typeof incremental === 'string' || Buffer.isBuffer(incremental)) - ? IncrementalSerializer.deserializeIncremental(incremental) - : incremental; + const isSerializedData = typeof incremental === 'string' || + (typeof Buffer !== 'undefined' && Buffer.isBuffer(incremental)) || + incremental instanceof Uint8Array; + + const snapshot = isSerializedData + ? IncrementalSerializer.deserializeIncremental(incremental as string | Buffer) + : incremental as IncrementalSnapshot; const registry = componentRegistry || ComponentRegistry.getAllComponentNames() as Map; diff --git a/packages/core/src/ECS/Serialization/IncrementalSerializer.ts b/packages/core/src/ECS/Serialization/IncrementalSerializer.ts index 95012d5e..63f40f48 100644 --- a/packages/core/src/ECS/Serialization/IncrementalSerializer.ts +++ b/packages/core/src/ECS/Serialization/IncrementalSerializer.ts @@ -687,7 +687,15 @@ export class IncrementalSerializer { if (typeof data === 'string') { // JSON格式:计算UTF-8编码后的字节数 - return Buffer.byteLength(data, 'utf8'); + // 使用 Blob 来计算浏览器和 Node.js 环境兼容的字节数 + if (typeof Blob !== 'undefined') { + return new Blob([data]).size; + } else if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(data, 'utf8'); + } else { + // 回退方案:粗略估算(不精确,但可用) + return new TextEncoder().encode(data).length; + } } else { // 二进制格式:直接返回Buffer长度 return data.length;