From 4c88d1c1d35f861f9e9ee60aa34faaf2aa4c60a2 Mon Sep 17 00:00:00 2001 From: "huiyu.zjt" Date: Mon, 8 Sep 2025 15:05:08 +0800 Subject: [PATCH 1/5] perf: batch update attributes --- .../src/display-objects/DisplayObject.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/g-lite/src/display-objects/DisplayObject.ts b/packages/g-lite/src/display-objects/DisplayObject.ts index d58493312..fe68a47fc 100644 --- a/packages/g-lite/src/display-objects/DisplayObject.ts +++ b/packages/g-lite/src/display-objects/DisplayObject.ts @@ -275,6 +275,25 @@ export class DisplayObject< } } + /** + * batch update attributes without attributeChangedCallback, for performance + * use with caution + * @param attributes + * @param parseOptions + */ + setAttributes( + attributes: Partial, + parseOptions: Partial = {}, + ) { + runtime.styleValueRegistry.processProperties( + this as unknown as DisplayObject, + attributes, + parseOptions, + ); + // redraw at next frame + this.dirty(); + } + /** * called when attributes get changed or initialized */ From e0b5eaa63d9831b137ed0075b612954715d4635c Mon Sep 17 00:00:00 2001 From: "huiyu.zjt" Date: Mon, 8 Sep 2025 17:36:37 +0800 Subject: [PATCH 2/5] perf: batch update attributes --- packages/g-lite/src/css/interfaces.ts | 1 + .../src/display-objects/DisplayObject.ts | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/packages/g-lite/src/css/interfaces.ts b/packages/g-lite/src/css/interfaces.ts index 913e06ab8..5cd296c0c 100644 --- a/packages/g-lite/src/css/interfaces.ts +++ b/packages/g-lite/src/css/interfaces.ts @@ -131,6 +131,7 @@ export interface PropertyParseOptions { forceUpdateGeometry: boolean; usedAttributes: string[]; memoize: boolean; + skipDispatchAttrModifiedEvent?: boolean; } export interface StyleValueRegistry { diff --git a/packages/g-lite/src/display-objects/DisplayObject.ts b/packages/g-lite/src/display-objects/DisplayObject.ts index d58493312..78342da74 100644 --- a/packages/g-lite/src/display-objects/DisplayObject.ts +++ b/packages/g-lite/src/display-objects/DisplayObject.ts @@ -275,6 +275,42 @@ export class DisplayObject< } } + /** + * batch update attributes without attributeChangedCallback, for performance + * use with caution + * @param attributes + * @param parseOptions + */ + setAttributes( + attributes: Partial, + parseOptions: Partial = {}, + ) { + const { skipDispatchAttrModifiedEvent = false } = parseOptions; + let oldAttributes; + let oldParsedValues; + if (!skipDispatchAttrModifiedEvent) { + oldAttributes = { ...this.attributes }; + oldParsedValues = { ...this.parsedStyle }; + } + runtime.styleValueRegistry.processProperties( + this as unknown as DisplayObject, + attributes, + parseOptions, + ); + // redraw at next frame + this.dirty(); + if (!skipDispatchAttrModifiedEvent) { + for (const key in attributes) { + this.dispatchAttrModifiedEvent( + key, + oldAttributes[key], + attributes[key], + oldParsedValues[key as string], + ); + } + } + } + /** * called when attributes get changed or initialized */ @@ -299,6 +335,15 @@ export class DisplayObject< // return; + this.dispatchAttrModifiedEvent(name, oldValue, value, oldParsedValue); + } + + private dispatchAttrModifiedEvent( + name: Key, + oldValue: StyleProps[Key], + value: StyleProps[Key], + oldParsedValue: ParsedStyleProps[keyof ParsedStyleProps], + ) { const newParsedValue = this.parsedStyle[name as string]; if (this.isConnected) { attrModifiedEvent.relatedNode = this as IElement; From bfe12bbcecf5ba37a97411bde2fc4d646e2e1069 Mon Sep 17 00:00:00 2001 From: "yunchen.wy" Date: Wed, 3 Dec 2025 13:58:57 +0800 Subject: [PATCH 3/5] 0.0.1-0 --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b87f91f5..544bad0e8 100644 --- a/package.json +++ b/package.json @@ -154,5 +154,6 @@ "limit": "150 Kb", "gzip": true } - ] + ], + "version": "0.0.1-0" } From c64d01433d324fa8db620d0febb4e8471290601a Mon Sep 17 00:00:00 2001 From: wang1212 Date: Wed, 24 Dec 2025 19:24:38 +0800 Subject: [PATCH 4/5] chore: add changeset --- .changeset/modern-queens-knock.md | 5 +++++ packages/g-lite/src/css/interfaces.ts | 3 +++ packages/g-lite/src/display-objects/DisplayObject.ts | 1 + 3 files changed, 9 insertions(+) create mode 100644 .changeset/modern-queens-knock.md diff --git a/.changeset/modern-queens-knock.md b/.changeset/modern-queens-knock.md new file mode 100644 index 000000000..d327cb294 --- /dev/null +++ b/.changeset/modern-queens-knock.md @@ -0,0 +1,5 @@ +--- +'@antv/g-lite': minor +--- + +feat: add experimental api `setAttributes` diff --git a/packages/g-lite/src/css/interfaces.ts b/packages/g-lite/src/css/interfaces.ts index 5cd296c0c..4f8f9bf0b 100644 --- a/packages/g-lite/src/css/interfaces.ts +++ b/packages/g-lite/src/css/interfaces.ts @@ -131,6 +131,9 @@ export interface PropertyParseOptions { forceUpdateGeometry: boolean; usedAttributes: string[]; memoize: boolean; + /** + * @experimental + */ skipDispatchAttrModifiedEvent?: boolean; } diff --git a/packages/g-lite/src/display-objects/DisplayObject.ts b/packages/g-lite/src/display-objects/DisplayObject.ts index 78342da74..66b526a4c 100644 --- a/packages/g-lite/src/display-objects/DisplayObject.ts +++ b/packages/g-lite/src/display-objects/DisplayObject.ts @@ -280,6 +280,7 @@ export class DisplayObject< * use with caution * @param attributes * @param parseOptions + * @experimental */ setAttributes( attributes: Partial, From 3aaa946e5711f6b6a9b21cca5955aa137a3cab8f Mon Sep 17 00:00:00 2001 From: wang1212 Date: Wed, 24 Dec 2025 19:29:31 +0800 Subject: [PATCH 5/5] chore: revert change --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 24a2406d4..55aa91079 100644 --- a/package.json +++ b/package.json @@ -155,6 +155,5 @@ "limit": "150 Kb", "gzip": true } - ], - "version": "0.0.1-0" + ] }