From ccc75a7329183d95982eda0c02522a7ab60d180e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=9D=E7=88=B7?= Date: Tue, 10 May 2022 23:12:08 +0800 Subject: [PATCH] temp commit --- assets/Script/example/SyncExmaple.ts | 12 ++-- assets/Script/sync/DiffScaner.ts | 4 ++ assets/Script/sync/DiffTrigger.ts | 6 +- assets/Script/sync/SyncUtil.ts | 85 ++++++---------------------- profiles/v2/packages/scene.json | 4 +- 5 files changed, 32 insertions(+), 79 deletions(-) diff --git a/assets/Script/example/SyncExmaple.ts b/assets/Script/example/SyncExmaple.ts index 96d2617..4684f83 100644 --- a/assets/Script/example/SyncExmaple.ts +++ b/assets/Script/example/SyncExmaple.ts @@ -1,6 +1,6 @@ import { Component, Label, _decorator, view, director, Node, RichText, tween, Tween, math, randomRange, Vec3, Quat, ModelComponent, Color } from "cc"; import { ReplicatedOption } from "../sync/ReplicateMark"; -import { applyDiff, genDiff, getReplicateObject, makeObjectReplicated, replicated, replicatedClass } from "../sync/SyncUtil"; +import { applyDiff, genDiff, getReplicateObject, makeObjectReplicated, replicated } from "../sync/SyncUtil"; const { ccclass, property } = _decorator; @@ -11,7 +11,6 @@ class A { b: number = 1; } -@replicatedClass() class B { a : number = 1; b : number = 2; @@ -29,12 +28,7 @@ export default class SyncExample extends Component { let a = new A(); a.a = 12; let diff = genDiff(a, 0, 1); - console.log(`${diff}`); - - let b = new B(); - b.a = 12; - diff = genDiff(b, 0, 1); - console.log(`${diff}`); + console.log(diff); /*let vec = new Vec3(Vec3.ZERO); makeObjectReplicated(vec); @@ -81,6 +75,8 @@ export default class SyncExample extends Component { let x = randomRange(-3, 3); let y = randomRange(-3, 3); let z = randomRange(-3, 3); + this.leftNode.setPosition(x, y, z); + return; tween(this.leftNode) .to(3.0, {position : new Vec3(x, y, z)}) .start(); diff --git a/assets/Script/sync/DiffScaner.ts b/assets/Script/sync/DiffScaner.ts index c52301b..ba35693 100644 --- a/assets/Script/sync/DiffScaner.ts +++ b/assets/Script/sync/DiffScaner.ts @@ -2,3 +2,7 @@ * 用扫描方式生成Diff * 2022-01-16 by 宝爷 */ + +export class DiffScanner { + +} \ No newline at end of file diff --git a/assets/Script/sync/DiffTrigger.ts b/assets/Script/sync/DiffTrigger.ts index 171e036..06e8828 100644 --- a/assets/Script/sync/DiffTrigger.ts +++ b/assets/Script/sync/DiffTrigger.ts @@ -1,4 +1,8 @@ /** * 用监听-触发的方式监控Diff的生成 * 2022-01-16 by 宝爷 - */ \ No newline at end of file + */ + +export class DiffTrigger { + +} \ No newline at end of file diff --git a/assets/Script/sync/SyncUtil.ts b/assets/Script/sync/SyncUtil.ts index 1e768be..b9c14ef 100644 --- a/assets/Script/sync/SyncUtil.ts +++ b/assets/Script/sync/SyncUtil.ts @@ -11,7 +11,7 @@ * 3. Diff的生成与Apply */ -import { getReplicateMark, ObjectReplicatedOption, ReplicatedOption } from "./ReplicateMark"; +import { ObjectReplicatedOption, ReplicatedOption } from "./ReplicateMark"; /** 属性变化回调 */ export type ReplicateNotify = (target: any, key: string, value: any) => boolean; @@ -49,9 +49,8 @@ export function getReplicateObject(target: any, autoCreator: boolean = false): R * 在不影响原来set方法的基础上自动跟踪属性变化 * @param target 要跟踪的实例 * @param propertyKey 要跟踪的Key - * @param descriptor ReplicatedOption - * @param option - * @returns 返回修改好的ReplicatedOption + * @param descriptor 要修改的descriptor + * @param option ReplicatedOption */ function makePropertyDescriptor(propertyKey: string, descriptor: PropertyDescriptor, option?: ReplicatedOption) { // 在不影响原来set方法的基础上自动跟踪属性变化 @@ -68,7 +67,7 @@ function makePropertyDescriptor(propertyKey: string, descriptor: PropertyDescrip delete descriptor.value; delete descriptor.writable; - if (oldValue === undefined + if (oldValue === undefined && Object.getOwnPropertyDescriptor(descriptor, "initializer")) { let desc = descriptor as any; oldValue = desc.initializer(); @@ -85,7 +84,7 @@ function makePropertyDescriptor(propertyKey: string, descriptor: PropertyDescrip } // 在不影响原来get方法的基础上,实现set方法的对应操作 - descriptor.get = function() { + descriptor.get = function () { let ret = undefined; if (oldGet) { ret = oldGet(); @@ -105,40 +104,40 @@ function makePropertyDescriptor(propertyKey: string, descriptor: PropertyDescrip * @param option 自定义同步选项 */ function makePropertyReplicated(target: any, propertyKey: string, descriptor?: PropertyDescriptor, option?: ReplicatedOption) { - if (!descriptor) { - descriptor = Object.getOwnPropertyDescriptor(target, propertyKey); - } if (descriptor) { - - if (IsSupportGetSet) { - makePropertyDescriptor(propertyKey, descriptor, option); - } else { - //getReplicateMark(target).addMark(propertyKey, oldValue, option); - } + makePropertyDescriptor(propertyKey, descriptor, option); + } else { + console.warn(`makePropertyReplicated error, ${propertyKey} not found in target ${target}`); } } /** * 将一个对象的所有成员设置为可复制,为对象自动添加__repObj__属性,同时跟踪该属性的变化 + * 当我们希望只对这个实例进行同步时可以调用这个方法 * @param target * @param option */ export function makeObjectReplicated(target: any, option?: ObjectReplicatedOption) { + let properties : any = {}; if (option && option.SyncProperty) { option.SyncProperty.forEach((pOpt) => { let descriptor = Object.getOwnPropertyDescriptor(target, pOpt.Name); if (descriptor) { makePropertyReplicated(target, pOpt.Name, descriptor, pOpt); + properties[pOpt.Name] = descriptor; } }); } else { let keys = Object.keys(target); keys.forEach((key) => { if (!(option?.SkipProperty && option.SkipProperty.indexOf(key) >= 0)) { - makePropertyReplicated(target, key, Object.getOwnPropertyDescriptor(target, key)); + let descriptor = Object.getOwnPropertyDescriptor(target, key); + makePropertyReplicated(target, key, descriptor); + properties[key] = descriptor; } }) } + Object.defineProperties(target, properties); } /** @@ -152,7 +151,7 @@ export function replicated(option?: ReplicatedOption) { }; } -export function replicatedClass(option?: ObjectReplicatedOption) { +/*export function replicatedClass(option?: ObjectReplicatedOption) { return (target: T) => { if (IsSupportGetSet) { makeObjectReplicated(target, option); @@ -165,7 +164,7 @@ export function replicatedClass(option?: ObjectReplicated } } } -} +}*/ /** * 一个属性的变化信息 @@ -335,52 +334,6 @@ export function applyDiff(diff: any, target: any) { }); } -function initReplicate(target: any) { - let markObj = getReplicateMark(target); - - // 延迟执行类的装饰 - let cls = markObj.getCls(); - let objMark = markObj.getObjMark(); - let isDef = markObj.getDefaultMark(); - if (!markObj.init && (isDef || objMark)) { - makeObjectReplicated(cls, objMark); - } - - let marks = markObj.getMarks(); - marks.forEach((info, propertyName) => { - let descriptor = Object.getOwnPropertyDescriptor(target, propertyName); - if (descriptor) { - let oldValue = descriptor.value; - let oldSet = descriptor.set; - - // 延迟执行属性的装饰,只初始化一次 - if(!markObj.init) { - makePropertyDescriptor(propertyName, descriptor, info.option); - } - - // 每个实例都需要对所有同步属性进行一次遍历 - if (oldValue != info.def) { - // 如果值发生了变化,触发一次赋值,以便于生成DIFF - // delete是因为实例身上可能已经覆盖了这个属性,而我们重新定义了类的原型,如果不删除,后续无法捕获属性的变化 - delete target[propertyName]; - target[propertyName] = oldValue; - } else if (oldValue) { - // 值没有发生变化,将值设置回去,但不计作DIFF - if (oldSet) { - oldSet(oldValue); - } else { - // TODO: 这里只执行一次,但每个对象在genDiff的时候,都有可能存在不同的差异 - let repObj = getReplicateObject(target); - repObj.propertyChanged(propertyName, oldValue, true); - } - } - } - }); - - // 初始化一次就够了 - markObj.init = true; -} - /** * 提取变化目标对象指定版本范围的的DIFF * 如果是首次生成DIFF,自动检测哪些属性需要被追踪 @@ -391,9 +344,5 @@ function initReplicate(target: any) { */ export function genDiff(target: any, from: number, to: number): any { let repObj = getReplicateObject(target, true); - if (!IsSupportGetSet && repObj.getLastVersion() == 0) { - initReplicate(target); - } - return repObj.genDiff(from, to); } diff --git a/profiles/v2/packages/scene.json b/profiles/v2/packages/scene.json index 0610fd1..9de91e5 100644 --- a/profiles/v2/packages/scene.json +++ b/profiles/v2/packages/scene.json @@ -111,7 +111,7 @@ "position": { "x": -2, "y": 0, - "z": 6.237669892207257 + "z": 6.237669892207258 }, "rotation": { "x": 0, @@ -127,7 +127,7 @@ } }, "camera-uuids": [ - "a18214d2-f37c-41d3-908b-0a859a46c913" + "d8be8bee-362a-494a-9643-8e52af4c0c15" ], "float-window": { "position": {