diff --git a/assets/Script/sync/ArrayReplicator.ts b/assets/Script/sync/ArrayReplicator.ts index 6afc139..9c988c1 100644 --- a/assets/Script/sync/ArrayReplicator.ts +++ b/assets/Script/sync/ArrayReplicator.ts @@ -275,9 +275,8 @@ export class ArrayReplicator implements IReplicator { } else { let data: IReplicator = this.data[i].data; // 如果由于数组的插入与删除,导致对象下标变化,则需要重新绑定 - if (this.data[i].index != i) { + if (data.getTarget() != this.target[i]) { data.setTarget(this.target[i]); - this.data[i].index = i; } let diff = data.genDiff(fromVersion, toVersion); // 如果不是新插入的,则需要有diff才进入ret @@ -356,9 +355,9 @@ export class ArrayReplicator implements IReplicator { export function TestArrayReplicator() { class Point { @replicated() - x: number; + x: number = 0; @replicated() - y: number; + y: number = 0; constructor(x: any = 0, y: any = 0) { this.x = x; this.y = y; @@ -373,10 +372,10 @@ export function TestArrayReplicator() { source.push(new Point(7, 8)); source[0].x = 10; source[1].y = 20; + console.log(source); let diff = replicator.genDiff(0, 1); console.log(diff); targetReplicator.applyDiff(diff); - console.log(source); console.log(target); source.splice(1,2); diff --git a/assets/Script/sync/DiffScaner.ts b/assets/Script/sync/DiffScaner.ts index 3f98e03..da2a90a 100644 --- a/assets/Script/sync/DiffScaner.ts +++ b/assets/Script/sync/DiffScaner.ts @@ -85,6 +85,7 @@ export class ReplicateScanner implements IReplicator { return false; } let ret: any = {}; + let changed = false; // 遍历生成Diff for (let [name, property] of this.dataMap) { // let setter = property.setter || name; @@ -94,6 +95,7 @@ export class ReplicateScanner implements IReplicator { let diff = property.data.genDiff(fromVersion, toVersion); if (diff) { ret[setter] = diff; + changed = true; } } else { if (needScan) { @@ -101,13 +103,18 @@ export class ReplicateScanner implements IReplicator { property.data = this.target[name]; ret[setter] = property.data; property.version = toVersion; + changed = true; } } else if (property.version > fromVersion) { ret[setter] = property.data; + changed = true; } } } this.lastCheckVersion = toVersion; + if (!changed) { + return false; + } return ret; } diff --git a/assets/Script/sync/SyncUtil.ts b/assets/Script/sync/SyncUtil.ts index d576ba9..f038bcc 100644 --- a/assets/Script/sync/SyncUtil.ts +++ b/assets/Script/sync/SyncUtil.ts @@ -103,7 +103,7 @@ function makeObjectReplicatedMark(cls: any, option?: ObjectReplicatedOption): Re export function replicated(option?: ReplicatedOption) { // 真正的装饰器 return (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => { - return makePropertyReplicatedMark(target.constructor, propertyKey, descriptor, option); + return makePropertyReplicatedMark(target, propertyKey, descriptor, option); }; }